2013-06-09 4 views
7

J'ai essayé de trouver un moyen de créer une solution de navigation basée sur les rôles dynamique pour un projet sur lequel je travaille.Navigation basée sur les rôles

La navigation doit afficher uniquement les liens qui sont liés au rôle des utilisateurs, par exemple: un administrateur aura des liens pour afficher les statistiques d'application, gérer les comptes clients, ect ... alors qu'un utilisateur standard aurait des liens pour gérer

J'ai actuellement une vue partielle unique appelée Navigation avec quelques instructions conditionnelles de base pour la vérification des rôles et un mélange de balisage pour afficher les liens appropriés. Cela fonctionne, mais, je sais que cela pourrait rapidement devenir ingérable.

Navigation Vue partielle:

@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 

Y at-il un moyen d'obtenir cette logique de la vue et de laisser la poignée du contrôleur cela?

+1

utilise votre partielle un enfant de la méthode d'action? –

+0

Merci Dave. Non. Je n'ai pas vraiment utilisé les actions pour enfants auparavant. Pourriez-vous développer votre question? Je ne suis pas sûr du rôle que les actions enfant joueraient dans ce scénario. – mezmi

+4

Les actions des enfants sont géniales. Ce sont des actions qui vous rendent un modèle partiel. vous les appelez 'Action ("/Controller/Action/id ")'. La partie id peut être votre identifiant pour la navigation que vous voulez créer et le modèle peut être une liste d'éléments nav. Mieux encore, votre action enfant peut rechercher le rôle de vos utilisateurs sans argument et retourner la barre de navigation appropriée. J'ai déjà utilisé ceci pour la navigation basée sur les rôles. –

Répondre

14

SOLUTION

Comme suggéré, je créé un ChildAction appelé menu et des vues partielles pour chaque rôle. Dans l'action, je vérifie les rôles en utilisant des instructions conditionnelles et restitue la vue appropriée.

Cela empêche les instructions conditionnelles de s'afficher, ce qui en fait une solution beaucoup plus propre.

Je suis sûr qu'il y a quelques choses qui pourraient être faites pour ranger et je vais continuer à essayer de l'améliorer.

Voici la solution que j'ai utilisée.

Dans l'affichage de mise en page où je voulais que le menu apparaisse, j'ai utilisé ceci. Ensuite, j'ai créé un contrôleur appelé Navigation et ajouté une seule action appelée Menu.

public class NavigationController : Controller 
{ 

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

     } 

     return PartialView("_NavigationPublic"); 
    } 

} 
Questions connexes