2013-06-09 16 views
7

Ho cercato di trovare un modo per creare una soluzione di navigazione dinamica basata sui ruoli per un progetto su cui sto lavorando.Navigazione basata sui ruoli

La navigazione dovrebbe visualizzare solo i link che sono relativi al ruolo degli utenti, ad esempio: un amministratore dovrà collegamenti per visualizzare le statistiche di applicazioni, gestire gli account dei clienti, ect ... mentre un utente standard dovrebbe avere collegamenti per gestire il loro account, comunicare con gli amici, ecc.

Attualmente ho una singola vista parziale denominata Navigazione con alcune istruzioni condizionali di base per il controllo dei ruoli e un mix di markup per la visualizzazione dei collegamenti appropriati. Funziona, ma so che potrebbe diventare rapidamente ingestibile.

Navigazione Vista parziale:

@if(User.IsInRole("Admin")) { 
    <li><a href="#">Statistics</a></li> 
    <li><a href="#">Accounts</a></li> 
    <li><a href="#">Dashboard</a></li> 
} 
@if(User.IsInRole("User")) { 
    <li><a href="#">Account</a></li> 
    <li><a href="#">Friends</a></li> 
} 
// code omitted 

C'è un modo per ottenere questa logica fuori dalla vista e lasciare che il controller gestire questo?

+1

fa il tuo uso parziale un metodo di azione figlio? –

+0

Grazie Dave. No non lo fa. Non ho mai usato azioni figlio prima. Ti dispiacerebbe espandere la tua domanda? Non sono sicuro del ruolo delle azioni secondarie in questo scenario. – mezmi

+4

Le azioni dei bambini sono grandiose. Sono azioni che restituiscono un modello a te parziale. li chiameresti 'Action ("/Controller/Action/id ")'. La parte id può essere la tua maniglia per quale nav vuoi creare e il modello può essere una lista di elementi nav. Ancora meglio, l'azione figlio può cercare il ruolo degli utenti senza argomenti e restituire la barra di navigazione appropriata. Ho usato questo per la navigazione basata sui ruoli prima. –

risposta

14

SOLUZIONE

Come suggerito, ho creato un menu chiamato ChildAction e viste parziali per ogni ruolo. All'interno dell'azione eseguo alcuni controlli di ruolo utilizzando alcune istruzioni condizionali e il rendering della vista appropriata.

Questo mantiene le dichiarazioni condizionali fuori dalle viste che lo rende una soluzione molto più pulita.

Sono sicuro che ci sono alcune cose che potrebbero essere fatte per riordinarlo e continuerò a cercare di migliorarlo.

Ecco la soluzione che ho usato.

Nella vista di layout in cui volevo che comparisse il menu, l'ho usato.

@Html.Action("Menu", "Navigation") 

Quindi ho creato un controller chiamato Navigazione e aggiunto una singola azione denominata Menu.

public class NavigationController : Controller 
{ 

    [ChildActionOnly] 
    public ActionResult Menu() 
    { 
     if (Roles.IsUserInRole("Administrator")) 
     { 
      return PartialView("_NavigationAdmin"); 

     } 

     return PartialView("_NavigationPublic"); 
    } 

} 
Problemi correlati