2016-08-01 7 views
1

J'ai la classe d'autorisation suivante. Comment puis-je faire de cette disposition dans toutes les vues sans avoir à utiliser l'instruction suivante en utilisant dans chaque vue @using MyApp.ExtensionsASP MVC Make Class, espace de noms disponible dans tous les affichages

using System.Security.Principal; 

namespace MyApp.Entensions 
{ 
    public class Permissions 
    { 
     private readonly IPrincipal user; 

     public Permissions(IPrincipal user) 
     { 
      this.user = user; 
     } 


     public bool CanEditItems 
     { 
      get { return user.IsInAnyRole("Manager", "Admin"); } 
     } 

     public bool CanDeleteItems 
     { 
      get { return user.IsInAnyRole("Admin"); } 
     } 

     // Other permissions 

    } 
} 

J'ai essayé d'ajouter à l'web.config vues comme suit, mais je ne suis pas IntelliSense quand tryin appeler quelque chose comme @if (User.CanDeleteItems)

<pages pageBaseType="System.Web.Mvc.WebViewPage"> 
    <namespaces> 
    <add namespace="System.Web.Mvc" /> 
    <add namespace="System.Web.Mvc.Ajax" /> 
    <add namespace="System.Web.Mvc.Html" /> 
    <add namespace="System.Web.Optimization"/> 
    <add namespace="System.Web.Routing" /> 
    <add namespace="MyApp.Extensions" /> 
</namespaces> 
</pages> 
+0

Ne voulez-vous pas dire @ model.user.CanDeleteItems ou quelque chose comme ça? Sinon, quel est l'utilisateur dans votre fichier cshtml? –

+0

@Peter vous avez mal compris. Je ne passe pas dans un modèle. La classe étend le IPrinciple afin que l'utilisateur soit l'utilisateur actuellement connecté. – adam78

+0

Donc, vous faites une vérification et le rendu du contenu de la vue en fonction du résultat booléen de cette condition? Si oui, ne seriez-vous pas mieux enveloppant votre contenu au niveau du fichier de mise en page? – LDJ

Répondre

1

Si vous souhaitez ajouter des extensions à IPrinciple alors vous avez besoin d'une classe d'extension, comme si

using System.Security.Principal; 

namespace MyApp.Entensions 
{ 
    public static class Permissions 
    { 
     public static bool CanEditItems(this IPrinciple user) 
     { 
      return user.IsInAnyRole("Manager", "Admin"); 
     } 

     public static bool CanDeleteItems(this IPrinciple user) 
     { 
      return user.IsInAnyRole("Admin"); 
     } 

     // Other permissions 

    } 
} 

Non que la classe soit publique + statique, et les méthodes d'extension sont public + statique et ont également "this" avant le premier paramètre. Vous devrez modifier votre vue pour utiliser CanEditItems() en tant que méthode au lieu d'une propriété.

if (System.Web.HttpContext.Current.User.CanEditItems()) { ... } 
+1

Vous avez oublié de marquer les méthodes comme 'static'. – Kapol

+0

Merci @Kapol, j'avais en effet :) –