2016-08-01 99 views
1

我有以下Permission类。我怎样才能让所有的观点这可无需使用以下using语句在每个视图@using MyApp.ExtensionsASP MVC Make类命名空间在所有视图中可用

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 

    } 
} 

我试着将它添加到的意见的web.config如下,但我没有得到任何智能感知当试着拨打像@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

难道你不是指@ model.user.CanDeleteItems或类似的东西吗?否则,你的cshtml文件中的User是什么? –

+0

@彼得你误会了。我没有传入模型。该类扩展了IPrinciple,以便用户是当前登录的用户。 – adam78

+0

因此,您正在根据该条件的布尔结果进行检查并呈现视图的内容?如果是这样,你不是更好地包装在布局文件级别的内容? – LDJ

回答

1

如果你想添加扩展IPrinciple那么你就需要一个扩展类,像这样

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 

    } 
} 

不是该类是public + static,并且扩展方法是public + static,并且在第一个参数之前也有“this”。您将需要更改视图以将CanEditItems()用作方法而不是属性。

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

您忘记将方法标记为“static”。 – Kapol

+0

谢谢@卡波尔,我确实:) –

相关问题