2010-11-17 26 views
15

Esta es la situación que estoy tratando de resolver:Defaulting una sección en una vista Razor

Tengo un diseño principal compartido con una sola sección @RenderSection ("Menú") que quiero por defecto a 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 parece que no me gusta.

¿Sería mejor una vista parcial del menú para esta situación?

Editar:

Estoy recibiendo el siguiente error con este código ahora: En las secciones siguientes se han definido, pero no han sido prestados para el diseño de página "~/Views/Shared/_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> 
    } 

Respuesta

23

Ah ... Yo estaba jugando con esto y encontró que podía hacerlo con sólo cambiar la lógica en torno a:

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

Así que si mis páginas no definen @section Header { ... }, que hace que la omisión.

+0

Gracias Andy. Eso funcionó bien para mí y creo que es un poco más limpio que el menú parcial por separado. –

19

El método debe IsSectionDefined la habitación sus necesidades:

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

Actualización: 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

+0

Gracias, lo he probado pero estoy obteniendo: Las siguientes secciones se han definido pero no se han procesado para la página de diseño "~/Views/Shared/_Layout.cshtml": "menu". Agregaré mi código a mi OP para mostrar lo que hice. –

+2

Actualicé el código para solucionar el problema.Necesitas hacer '@RenderSection()' en lugar de simplemente 'RenderSection()' – marcind

3

Actualmente estoy usando diseños múltiples para lograr exactamente este mismo escenario.

/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, de forma predeterminada, todas mis vistas obtienen el diseño con un menú predeterminado. Sin embargo, vista por imagen, puedo configurar Layout en _Layout.cshtml y luego implementar @section Menu.

+0

Intenté ambos enfoques y aunque creo que el otro enfoque es más limpio, el tuyo funcionó mientras que en el otro recibo el error que mencioné anteriormente en el editar. –

Cuestiones relacionadas