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>
    }
¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top