【问题标题】:ASP MVC Make Class Namespace Available In All ViewsASP MVC 使类命名空间在所有视图中可用
【发布时间】:2016-12-06 15:04:32
【问题描述】:

我有以下权限类。我怎样才能使它在所有视图中都可用,而不必在每个视图中使用以下 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>

【问题讨论】:

  • 你的意思是不是@model.user.CanDeleteItems 或类似的东西?否则,您的 cshtml 文件中的 User 是什么?
  • @Peter 你误会了。我没有传递模型。该类扩展了 IPrinciple,因此 User 是当前登录的用户。
  • 所以您正在根据该条件的布尔结果进行检查并渲染视图的内容?如果是这样,在布局文件级别包装内容不是更好吗?
  • 您提供的代码未扩展IPrinciple
  • 如果我的答案解决了您的问题,请不要忘记将我的答案标记为已接受

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


【解决方案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()) { ... }

【讨论】:

  • 谢谢@Kapol,我确实有:)