2011-11-07 1 views
12

Sul mio sito web, ho una sezione (una barra laterale mobile) che voglio renderizzata solo per un sottoinsieme di utenti (amministratori). Spero di poter inserire la logica nel layout principale per determinare se la sezione debba essere mostrata o meno, ma questo causa un errore nella pagina se la sezione non viene renderizzata.Come si rende facoltativamente il rendering di una sezione in ASP.Net MVC 3?

codice di esempio - Layout.cshtml ... codice

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

Esempio - MyPage.cshtml ...

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

Qualcuno sa come ottenere questo a lavorare senza dover mettere il logica in tutte le pagine figlio?

Come nota, IsSectionDefined ("AdminSidebar") funziona solo nel file di layout. Non funziona nella pagina per verificare se la sezione è disponibile o meno.

risposta

16

Non so se questo non sta abusando del quadro, ma se siete veramente incline ad andare in questo modo si potrebbe provare i seguenti:

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

Intelligente. Mi piace. Mi auguro che il framework MVC abbia ignorato solo le sezioni che non sono state definite invece di generare errori, ma ciò mi consente di definire la sezione nel modo che voglio. – Brian

+0

@Brian Ma perché non utilizzare il renderPartial come suggerito da itsmatt, che è molto più pulito? – gdoron

+0

Perché allora dovrei creare un partial per ogni pagina che voglio aggiungere anche una sidebar (è contestuale in base alla pagina). – Brian

0

L'utilizzo di una sezione per qualcosa che è condizionale in base al livello di autorizzazione dell'utente mi sembra un po 'sporco. Vorrei utilizzare RenderPartial (utente) e inserire la logica nel parziale.

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

Nel mio file _Layout.cshtml ho fatto qualcosa di simile:

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

per evitare di dover avere tutte le pagine figlio hanno a che fare con la sezione facoltativa essenzialmente nello stesso modo. Quando ho provato per la prima volta la sezione opzionale, ho scoperto che mi stavo ripetendo nelle pagine dei bambini, almeno nella mia implementazione.

Dove ho utilizzato la chiamata @RenderSection per le sezioni facoltative, è stato generalmente necessario fornire elementi specifici della pagina.

+0

Grazie, ma purtroppo ogni pagina può avere diversi elementi nella barra laterale (è fondamentalmente un insieme di strumenti contestuali) quindi non funzionerebbe. – Brian