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

本文关键字:视图 MVC 命名空间 ASP | 更新日期: 2023-09-27 17:59:36

我有以下Permission类。如何在不必在每个视图中使用以下using语句的情况下使其在所有视图中可用@using MyApp.Extensions

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>

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

如果你想向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+静态,并且在第一个参数之前也有"this"。您需要更改视图以将CanEditItems()用作方法而不是属性。

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