2013-06-09 13 views
7

Ich habe versucht, eine Möglichkeit zu finden, eine dynamische rollenbasierte Navigationslösung für ein Projekt zu erstellen, an dem ich gerade arbeite.Rollenbasierte Navigation

sollte die Navigation nur Links angezeigt, die auf die Rolle Benutzer relativ sind, zum Beispiel: ein Administrator Links Anwendungsstatistik anzeigen, verwalten Kundenkonto, ect ..., während ein Standardbenutzer Link müßte haben zu verwalten Ihr Konto, kommunizieren mit Freunden, usw.

Ich habe derzeit eine einzige Teilansicht namens Navigation mit einigen grundlegenden bedingten Anweisungen für die Überprüfung der Rolle und eine Mischung aus Markup für die Anzeige der entsprechenden Links. Das funktioniert, aber ich weiß, dass es schnell unübersichtlich werden könnte.

Navigation Teilansicht:

@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 

Gibt es eine Möglichkeit, diese Logik aus dem Blick zu bekommen und lassen Sie den Regler damit umgehen?

+1

verwendet Ihre Teilweise ein Kind Aktionsmethode? –

+0

Danke Dave. Nein, tut es nicht. Habe bisher noch keine Child Actions verwendet. Würde es Ihnen etwas ausmachen, auf Ihre Frage zu erweitern? Ich bin mir nicht sicher, welche Rolle Kindaktionen in diesem Szenario spielen würden. – mezmi

+4

Kind Aktionen sind großartig. Sie sind Aktionen, die ein Modell teilweise an Sie zurückgeben. Sie würden sie 'Aktion ("/Controller/Action/id ") nennen. Der ID-Teil kann Ihr Handle sein, zu welchem ​​Nav Sie erstellen möchten, und das Modell kann eine Liste von Nav-Elementen sein. Noch besser, Ihre Kinderaktion kann Ihre Benutzerrolle ohne Argument nachschlagen und die richtige Navigationsleiste zurückgeben. Ich habe dies bereits für die rollenbasierte Navigation verwendet. –

Antwort

14

SOLUTION

Wie bereits angedeutet, habe ich eine ChildAction genannt Menü und Teilansichten für jede Rolle. Innerhalb der Aktion teste ich einige Rollen mit einigen bedingten Anweisungen und rendere die entsprechende Ansicht.

Dies hält die bedingten Anweisungen aus den Ansichten, die es eine viel sauberere Lösung macht.

Ich bin sicher, es gibt ein paar Dinge, die getan werden könnten, um es aufzuräumen und ich werde weiter versuchen, es zu verbessern.

Hier ist die Lösung, die ich verwendet habe.

In der Layout-Ansicht, wo ich das Menü angezeigt werden wollte, habe ich das verwendet.

Dann habe ich einen Controller namens Navigation erstellt und eine einzige Aktion namens Menü hinzugefügt.

public class NavigationController : Controller 
{ 

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

     } 

     return PartialView("_NavigationPublic"); 
    } 

}