【问题标题】:Role-Based Content asp.net mvc基于角色的内容 asp.net mvc
【发布时间】:2013-11-29 22:18:20
【问题描述】:

我希望在 ASP.NET MVC 中根据活动用户的给定角色显示内容。

比较老式的方式,使用 WebForms:

protected void Page_Load(Object sender, EventArgs e)
{
   if(User.IsInRole("Administrator")) {
       adminLink.Visible = true;
   }
}

现在在使用 ASP.NET MVC 时我将如何继续编写它? 从我的角度来看,直接将它放在视图文件中是错误的,并且为每个视图分配一个变量也不会很漂亮。

【问题讨论】:

    标签: asp.net-mvc


    【解决方案1】:

    创建 Html 助手并检查其代码中的当前用户角色:

    public static class Html
    {
        public static string Admin(this HtmlHelper html)
        {
            var user = html.ViewContext.HttpContext.User;
    
            if (!user.IsInRole("Administrator")) {
                // display nothing
                return String.Empty;
    
                // or maybe another link ?
            }
    
            var a = new TagBuilder("a");
            a["href"] = "#";
            a.SetInnerText("Admin");
    
            var div = new TagBuilder("div") {
                InnerHtml = a.ToString(TagRenderMode.Normal);
            }
    
            return div.ToString(TagRenderMode.Normal);
        }
    }
    

    更新:

    或者为股票 Html 帮助器创建包装器。 ActionLink(this HtmlHelper htmlHelper, string linkText, string actionName, string controllerName) 示例:

    public static class Html
    {
        public static string RoleActionLink(this HtmlHelper html, string role, string linkText, string actionName, string controllerName)
        {
            return html.ViewContext.HttpContext.User.IsInRole(role)
                ? html.ActionLink(linkText, actionName, controllerName)
                : String.Empty;
        }
    }
    

    【讨论】:

    • 有趣。也许我什至可以为标准 html 组件或类似组件创建重载。比如:Html.ActionLink(...).RequireRole("Admin") 除了到处都有 if/else 语句之外的任何东西都会是一个更好的解决方案。
    • 我认为最好为现有的 Html 助手创建包装器。
    • 我认为您应该更新RoleActionLink 方法以使用MvcHtmlString 而不是String
    【解决方案2】:

    不,你会把它放在视图文件中,就像实际上一样:

    <% If (User.IsInRole("Administrator")) { %>
    <div>Admin text</div>
    <% } %>
    

    【讨论】:

    • 我认为克劳斯说这种逻辑不属于视图是正确的。这当然可行,但您的代码很快就会变得无法维护。
    • 我同意,但这确实取决于需要为管理员隐藏的代码量。将单个块提取到操作结果实际上可能会降低其可读性...
    【解决方案3】:

    这对我有用:

     <% MembershipUser mu = Membership.GetUser();
                        if (mu != null)
                            if (Roles.IsUserInRole(mu.UserName, "Administrator"))
                            {
                         %>
                    <li class="paddingleftThree"><%= Html.ActionLink("User Administration", "GetUsers", "Account")%></li> <%} %>
    

    【讨论】:

      【解决方案4】:

      在我看来,ASP.NET MVC 4 How do you serve different HTML based on Role? 中建议的关注点分离方法是一种更好的方法。

      我个人在代码中尽可能避免 IsInRole 检查,并将其留给声明性方式来尽可能实现基于角色的限制。这确保了代码随着时间的推移保持可维护性。我不确定这是对还是错,但对我来说效果很好。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-05
        • 2021-03-19
        • 2016-03-07
        • 2014-10-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多