Question

Voici la situation dans laquelle je suis en train de résoudre:

J'ai une mise en page principale commune avec @RenderSection section unique ( « Menu ») que je veux par défaut d'un menu standard pour la majorité de mes pages, mais je voudrais remplacer / remplacer cette section dans quelques sous pages. Est-ce possible avec rasoir à ce stade dans le jeu?

J'espérais que je pourrais peut-être définir l'implémentation par défaut de cette section dans _ViewStart.cshtml mais il ne semble pas aimer.

Est-ce qu'un menu Vue partielle mieux pour cette situation?

Edit:

Je reçois l'erreur suivante avec ce code maintenant: Les sections suivantes ont été définies mais n'ont pas été rendus pour la page de mise en page « ~ / Vues / Shared / _Layout.cshtml »: « menu »

.

_Layout.cshtml

            <div id="menu">
@if (IsSectionDefined("menu"))
{
    RenderSection("menu");
}
else { 
    <text>
            <ul>
                <li>@Html.ActionLink("Home", "Index", "Home")</li>
                <li><a href="#">Lookups</a>
                    <ul>
                        @Html.ActionLink("Product","Index","Product")
                    </ul>
                </li>
            </ul>
    </text>
}
        </div>

Index.cshtml

@section menu {
            <ul>
                <li>@Html.ActionLink("Product", "Index", "Product")</li>
                <li>@Html.ActionLink("Form Type", "Index", "Product")</li>
                <li>@Html.ActionLink("Supplier", "Index", "Product")</li>
            </ul>
    }
Était-ce utile?

La solution

Ah ... je déconner avec cela et trouvé que je pouvais le faire en changeant simplement la logique autour:

@RenderSection("Header", false)
@if (!IsSectionDefined("Header")) { 
<header>
    Default Header!
</header>
}

Donc, si mes pages ne définissent pas @section Header { ... }, il rend la valeur par défaut.

Autres conseils

La méthode IsSectionDefined devrait satisfaire vos besoins:

@if(IsSectionDefined("Menu")) {
    @RenderSection("Menu")
} else {
    <text>
        Default Menu Content.
    </text>
}

Mise à jour : J'ai écrit un billet de blog pour mieux illustrer les options disponibles: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/Optional-Razor-Sections-with -default-Content.aspx

J'utilise actuellement plusieurs mises en page pour atteindre ce même scénario.

/Views/Shared/_Layout.cshtml

<html>
  ...
  <body>
    <div id="menu">@RenderSection("Menu", required:false)</div>
    ...
    @RenderBody()
    ...
  </body>
</html>

/Views/Shared/_LayoutWithDefaultMenu.cshtml

@{ Layout = "~/Views/Shared/_Layout.cshtml"; }
@section Menu { @Html.Partial("Menu") }
@RenderBody()

/Views/_ViewStart.cshtml

@{ Layout = "~/Views/Shared/_LayoutWithDefaultMenu.cshtml"; }

Ce que cela signifie est que, par défaut, toutes mes vues obtenir la mise en page avec un menu par défaut. Toutefois, sur une base vue par vue, je peux définir la mise en page à _Layout.cshtml puis mettre en œuvre moi-même @section Menu.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top