Incumplimiento de una sección en una vista de afeitar
-
25-09-2019 - |
Pregunta
Aquí está la situación que estoy tratando de resolver:
Tengo un diseño compartido principal con una sola sección @RenderSection ("menú") que quiero predeterminar un menú estándar para la mayoría de mis páginas, pero me gustaría reemplazar/anular esa sección en algunas páginas secundarias. ¿Es esto posible con Razor en esta etapa del juego?
Esperaba poder definir la implementación predeterminada de esa sección en _viewstart.cshtml, pero no parece que le guste.
¿Sería mejor una vista parcial de menú para esta situación?
Editar:
Ahora recibo el siguiente error con este código: las siguientes secciones se han definido pero no se han representado para la página de diseño "~/Vistas/compartir/_layout.cshtml": "Menú".
_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>
}
Solución
Ah ... estaba jugando con esto y descubrí que podía hacerlo simplemente cambiando la lógica:
@RenderSection("Header", false)
@if (!IsSectionDefined("Header")) {
<header>
Default Header!
</header>
}
Entonces, si mis páginas no definen @section Header { ... }
, representa el valor predeterminado.
Otros consejos
los IsSectionDefined
El método debe satisfacer sus necesidades:
@if(IsSectionDefined("Menu")) {
@RenderSection("Menu")
} else {
<text>
Default Menu Content.
</text>
}
Actualizar: Escribí una publicación de blog para ilustrar mejor las opciones disponibles: http://blogs.msdn.com/b/marcinon/archive/2010/12/08/optional-razor-sections-with-default-content.aspx
Actualmente estoy usando múltiples diseños para lograr este mismo escenario exacto.
/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"; }
Lo que esto significa es que, por defecto, todas mis vistas obtienen el diseño con un menú predeterminado. Sin embargo, sobre una vista por visión, puedo establecer el diseño en _Layout.cshtml
y luego implementar @section Menu
mí mismo.