2014-07-23 1 views
3

J'essaie de masquer les contrôles en fonction du rôle d'un utilisateur. J'avais l'habitude de faire quelque chose commeContrôles spécifiques au rôle dans les vues

@if (User.IsInRole("Admin")) 
      {Html.ActionLink("RolesAdmin", "Index", "RolesAdmin")} 

dans la vue mais cela ne semble pas fonctionner plus. Après beaucoup de recherches, j'ai trouvé que Identity 2.0 n'utilisait pas ça du tout.

Y at-il encore quelque chose que je peux utiliser directement à partir de la vue? Ou est-ce que je fais cela complètement faux?

+0

« Identity 2.0 n'utilise pas du tout. » est incorrect. Voir la réponse de Hao ci-dessous. Plusieurs milliers de clients rapportent que les rôles fonctionnent bien dans mon tutoriel http://azure.microsoft.com/fr-fr/documentation/articles/web-sites-dotnet-deploy-aspnet-mvc-app-membership-oauth-sql-database/ – RickAndMSFT

Répondre

0

Ce type de logique est mieux placé dans un contrôleur, laissez les vues pour le rendu.

Vous pouvez utiliser Html.Action avec une combinaison de ChildActions dans votre contrôleur et afficher des vues partielles en fonction du rôle des utilisateurs.

J'ai posté une question similaire à cela il y a quelque temps et je pense que cela vous serait utile.

Role Based Navigation

-Edit-

Pour plus de précisions, cela fonctionne en utilisant la nouvelle identité ASP.NET

Cela irait dans la mise en page

@Html.Action("BuildNavigation", "Component") 

et ceci soyez votre contrôleur.

public class ComponentController : Controller 
{ 

    [ChildActionOnly] 
    public ActionResult BuildNavigation() 
    { 

     if (this.User.IsInRole("customer")) 
     { 
      return PartialView("_NavigationCustomer"); 
     } 
     else 
     { 
      return PartialView("_NavigationBasic"); 
     } 


    } 
} 

Cela devrait vous aider à aller dans la bonne direction.

+0

C'est une belle solution et je l'ai mise tout de suite car c'est exactement ce que je voulais mais malheureusement quand j'ai essayé de l'exécuter, j'ai eu: "La fonction Role Manager n'a pas été activée". J'ai été dans cette voie hier et tous les messages que j'ai trouvés me conseillaient d'ajouter un RoleManager à mon web.config qui semblait également être une impasse. – RekaB

+0

Je l'ai obtenu en utilisant [cette réponse] (http://stackoverflow.com/a/24311573/2932714) – RekaB

+0

La solution de Hao ci-dessous ne nécessite pas de maintenir deux vues différentes. L'affichage simple/ne pas afficher la logique est très bien dans la vue. Consultez la vue Views \ Shared \ _LoginPartial.cshtml, qui a une logique similaire. – RickAndMSFT

0

Cela devrait encore fonctionner correctement, car les échantillons d'identité sont actuellement en train de faire quelque chose de similaire pour afficher uniquement les liens de haut niveau pour « Admins »

  @if (Request.IsAuthenticated && User.IsInRole("Admin")) { 
       <li>@Html.ActionLink("RolesAdmin", "Index", "RolesAdmin")</li> 
       <li>@Html.ActionLink("UsersAdmin", "Index", "UsersAdmin")</li> 
      } 
+0

Juste essayé et il ne semble pas fonctionner ...? – RekaB

+0

Ce type d'instructions conditionnelles n'appartient pas vraiment à la vue. Le contrôleur devrait gérer cela. – mezmi

+1

Avant que cela ne devienne incontrôlable, le point de nwdev est valide: mettre le code de contrôle de rôle dans la vue enfreint le modèle MVC, donc cette question (et l'exemple d'identité) ne suit pas les meilleures pratiques pour MVC dans ce cas. –

Questions connexes