Inadimplendo uma seção em uma visualização de barbear
-
25-09-2019 - |
Pergunta
Aqui está a situação que estou tentando resolver:
Eu tenho um layout compartilhado principal com uma única seção @RenderSection ("Menu") que quero padrão para um menu padrão para a maioria das minhas páginas, mas gostaria de substituir/substituir essa seção em algumas sub -páginas. Isso é possível com a Razor nesta fase do jogo?
Eu esperava poder definir a implementação padrão dessa seção em _Viewstart.cshtml, mas não parece gostar.
Uma visão parcial do menu seria melhor para essa situação?
Editar:
Estou recebendo o seguinte erro com este código agora: as seções a seguir foram definidas, mas não foram renderizadas para a página de layout "~/Views/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>
}
Solução
Ah ... eu estava mexendo com isso e descobri que poderia fazer isso apenas mudando a lógica:
@RenderSection("Header", false)
@if (!IsSectionDefined("Header")) {
<header>
Default Header!
</header>
}
Então, se minhas páginas não definir @section Header { ... }
, ele renderiza o padrão.
Outras dicas
o IsSectionDefined
O método deve obtenção de suas necessidades:
@if(IsSectionDefined("Menu")) {
@RenderSection("Menu")
} else {
<text>
Default Menu Content.
</text>
}
Atualizar: Escrevi uma postagem no blog para ilustrar melhor as opções disponíveis: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-ensction-with-default-content.aspx
Atualmente, estou usando vários layouts para alcançar exatamente esse mesmo cenário.
/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"; }
O que isso significa é que, por padrão, todas as minhas opiniões obtêm o layout com um menu padrão. No entanto, em uma base de vista a vista, posso definir o layout como _Layout.cshtml
e depois implementar @section Menu
Eu mesmo.