2016-08-01 5 views
1

Ich habe die folgende Berechtigungsklasse. Wie kann ich diese zur Verfügung zu stellen in allen Ansichten ohne @using MyApp.ExtensionsASP MVC machen Class-Namespace in allen Ansichten verfügbar

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 

    } 
} 

in jeder Ansicht die folgende using-Anweisung verwenden Ich habe versucht, es auf die Ansichten web.config Zugabe wie folgt, aber ich bekomme keine Intellisense wenn tryin etwas nennen wie @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

Meinst du nicht @ model.user.CanDeleteItems oder so ähnlich? Was ist der Benutzer in Ihrer cshtml-Datei? –

+0

@Peter Sie haben missverstanden. Ich gebe kein Modell weiter. Die Klasse hat das IPrinciple erweitert, so dass Benutzer der aktuell angemeldete Benutzer ist. – adam78

+0

Sie überprüfen also den Inhalt der Ansicht anhand des booleschen Ergebnisses dieser Bedingung? Wenn ja, wäre es nicht besser, Ihre Inhalte auf Layout-Ebene zu verpacken? – LDJ

Antwort

1

Wenn Sie Erweiterungen IPrinciple hinzufügen möchten, dann müssen Sie eine Erweiterung Klasse, wie so

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 

    } 
} 

Nicht, dass die Klasse public + static ist, und die Erweiterungsmethoden sind public + static und haben auch "this" vor dem ersten Parameter. Sie müssen Ihre Ansicht ändern, um CanEditItems() als Methode anstelle einer Eigenschaft zu verwenden.

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

Sie haben vergessen, die Methoden als 'statisch' zu markieren. – Kapol

+0

Danke @Kapol, ich hatte in der Tat :) –