C# MVC4隐藏具有自定义属性的链接

C# MVC4隐藏具有自定义属性的链接,c#,entity-framework-5,C#,Entity Framework 5,我已经挖掘了一段时间,现在试图找出如何在视图中使用我的自定义属性类来显示和隐藏链接。我正在从IsInRole转换到custom authorized属性,因为我希望最终用户选择授权哪些组执行某些任务。到目前为止,我一直在使用: @{ if (HttpContext.Current.User.IsInRole("UserMgr")) { Html.ActionLink("Edit", "Edit", new { id = item.pkRecID }); }

我已经挖掘了一段时间,现在试图找出如何在视图中使用我的自定义属性类来显示和隐藏链接。我正在从IsInRole转换到custom authorized属性,因为我希望最终用户选择授权哪些组执行某些任务。到目前为止,我一直在使用:

        @{ if (HttpContext.Current.User.IsInRole("UserMgr"))
           { Html.ActionLink("Edit", "Edit", new { id = item.pkRecID }); }
        }
其中UserMgr是一个域组。(这确实有效,但不是我需要做的)

然后,我创建了一个自定义属性类:

    public class isAuthorized : AuthorizeAttribute
{
    public string Access { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);

        string[] aszList = Access.Split(',');

        if (!authorized)
        {
            // The user is not authenticated
            return false;
        }

        var user = httpContext.User;
        if (user.IsInRole("Admin"))
            return true;

        var rd = httpContext.Request.RequestContext.RouteData;
        var id = rd.Values["id"] as string;
        if (string.IsNullOrEmpty(id))
        {
            // Now id was specified => we do not allow access
            return false;
        }

        foreach (string szGroup in aszList) // check to see if user is in group
        {
            if (user.IsInRole(szGroup))
            {
                return true;
            }
        }

        return false;
    }
这在我的控制器中起作用,阻止对函数的访问,但如何使用此函数隐藏视图中的链接


谢谢

您可以创建一个扩展方法,以便将其应用于Cshtml文件中的MvcHtmlStrings 例如:

然后在html元素上,您可以这样使用它:

@Html.ActionLink("Reports", "Index", "Report").If(User.IsInRole("SuperAdmin"))
更新

步骤:

  • 在项目中创建新的静态类

  • 将建议的扩展方法添加到新创建的类中

  • 要使此静态类在所有cshtml视图中可用,请转到位于views文件夹中的webconfig

  • 再次注意,如果web配置位于“视图”文件夹中,请不要编辑应用程序根目录下的配置

  • 这里添加了静态类所在的名称空间,如下例所示

    <system.web.webPages.razor>
      <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <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.Routing" /> 
        <add namespace="YourApplication.Utils"/>  <!-- THIS IS THE EXAMPLE ON HOW TO INSERT THE NAMESPACE THAT CONTAINS YOUR STATIC CLASS --> 
        <add namespace="Microsoft.Web.Helpers"/>
      </namespaces>
      </pages>
    </system.web.webPages.razor>
    
    
    

  • 我无法解释得比这更好。

    你的意思是隐藏cshtml中的元素,以便只有拥有更高权限的用户才能看到它?是的,这是正确的,我想在我的cshtml中隐藏链接和按钮,这取决于他们是否有权使用上面的类提供的链接和按钮。我理解你的意图,但它如何应用于我的授权功能?我是否将其与我的助手类或每个控制器放在一起?好的,您可以使用authorize方法而不是User.IsInRole。对于实用程序扩展方法,我建议使用一个静态类,它包含这样的帮助程序。这是我发现的最干净的方式。我真的明白你在说什么,这正是我想要做的;谢谢但是,我仍然不确定Extension方法放在哪里?如果我把它放在自定义authorized属性中,我会得到一个错误扩展methode,它必须在非泛型静态类中定义。如果我把这个函数放在我的控制器中,它就不会出现在我的.cshtml中。谢谢,弗里曼。我已经知道了。如果我尝试将扩展方法添加到自定义authorize类中,我会得到“扩展方法必须定义为非泛型静态类”,这会触发我在class:public static class isAuthorized:authorized属性中放入静态声明。但我随后发现了一个错误:扩展方法必须在非泛型静态类中定义。谢谢你的帮助;我真的很感激!顺便说一句,这是超级光滑和非常优雅。
    <system.web.webPages.razor>
      <host factoryType="System.Web.Mvc.MvcWebRazorHostFactory, System.Web.Mvc, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" />
      <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.Routing" /> 
        <add namespace="YourApplication.Utils"/>  <!-- THIS IS THE EXAMPLE ON HOW TO INSERT THE NAMESPACE THAT CONTAINS YOUR STATIC CLASS --> 
        <add namespace="Microsoft.Web.Helpers"/>
      </namespaces>
      </pages>
    </system.web.webPages.razor>