ASP MVC使类命名空间在所有视图中可用

时间:2016-08-01 13:42:30

标签: c# asp.net-mvc razor iprincipal

我有以下Permission类。如何在所有视图中使其可用,而无需在每个视图@using MyApp.Extensions

中使用以下using语句
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>

1 个答案:

答案 0 :(得分: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()) { ... }