2011-11-07 17 views
12

En mi sitio web, tengo una sección (una barra lateral flotante) que quiero que se represente solo para un subconjunto de usuarios (administradores). Espero poder poner la lógica en el diseño maestro para determinar si la sección se debe mostrar o no, pero eso causa un error en la página si la sección no se procesa.¿Cómo puedo renderizar opcionalmente una sección en ASP.Net MVC 3?

Código de ejemplo - Layout.cshtml ... código

... code ... 
@if(user.IsAdmin) { 
    @RenderSection("AdminSidebar", false) 
} 

Ejemplo - MyPage.cshtml ...

@section AdminSidebar { 
    ... code ... 
} 

¿Alguien sabe cómo conseguir que esto funcione sin tener que poner la lógica en todas las páginas secundarias?

Como nota, IsSectionDefined ("AdminSidebar") solo funciona en el archivo de diseño. No funciona en la página para probar si la sección está disponible o no.

Respuesta

16

No sé si esto no está abusando del marco, pero si usted es realmente dispuestos a ir de esa manera se podría tratar de los siguientes:

@{ 
    if(user.IsAdmin) { 
     @RenderSection("AdminSidebar", false) 
    } 
    else { 
     RenderSection("AdminSidebar", false).WriteTo(TextWriter.Null); 
    } 
} 
+1

inteligente. Me gusta. Me gustaría que el framework MVC simplemente ignorara las secciones que no estaban definidas en lugar de arrojar errores, pero esto me permite definir la sección de la manera que quiero. – Brian

+0

@Brian ¿Por qué no usar el renderPartial como lo sugiere itsmatt, que es mucho más limpio? – gdoron

+0

Porque entonces tendría que crear un parcial para cada página en la que quiero agregar una barra lateral (se basa en el contexto de la página). – Brian

0

Usar una sección para algo que es condicional basado en el nivel de permiso del usuario me parece un poco sucio. Yo usaría RenderPartial (usuario) y pondré la lógica en el parcial.

@if(user.IsAdmin) { 
     ..code.. 
    } 
1

En mi archivo _Layout.cshtml he hecho algo como esto:

@if(user.IsAdmin) 
{ 
    @Html.Partial("SideBar") 
} 

para no tener que tener todas las páginas hijas tienen que hacer frente a la sección opcional esencialmente de la misma manera. Cuando probé por primera vez la sección opcional, descubrí que me estaba repitiendo en las páginas secundarias, al menos en mi implementación.

Donde he usado la llamada @RenderSection para las secciones opcionales, generalmente ha sido para proporcionar cosas específicas de la página.

+0

Gracias, pero por desgracia cada página puede tener diferentes elementos en la barra lateral (básicamente es un conjunto de herramientas contextuales), así que esto no funcionaría. – Brian

Cuestiones relacionadas