根据用户角色限制用户控件的功能

时间:2012-07-07 13:17:41

标签: c# asp.net asp.net-mvc asp.net-mvc-3 asp.net-mvc-2

在ASP.Net MVC Web应用程序中创建用户控件的最佳实践和/或标准是什么,能够根据用户角色或用户本身限制其功能?

换句话说,假设我有四个不同的网页,其中90%具有完全相似的内容(一些搜索字段,包含搜索结果的网格,一些javascript,...),每个网页可能有一个或两个其他搜索字段。 (请注意,每个页面上的这些额外搜索字段在搜索结果中都有效。另请考虑我们在场景后面使用相同的存储过程,并且在搜索字段较少的页面中,我们传递空值或默认值 - 基于情况 - 给他们。

我们正在寻找一种重构代码的方法,如果可以在四页中的每一页中使用 USER CONTROL

编辑:也许我应该将问题更正为:如何避免将<%if(...)%>视图中的标签并使用类似于here所描述的方法,其中CRice说:“最好让viewdata或model表示视图要显示的内容,并且视图可以简单地检查视图数据。操作的控制器基类或过滤器可以使重复使用这个非常简单,并允许代码存在于一个地方。“为了解决我的问题?

人们一直在强调检查用户角色部分。事实上,当我问这个问题时,我已经知道了这一点。我不知道的是如何以正确的方式,使用viewdata或模型或任何适合这种情况的方式。 (特别使用reference question

中描述的模型

非常感谢你指导我和你的耐心。

2 个答案:

答案 0 :(得分:1)

  

我们正在寻找一种重构代码的方法,如果可以的话   相反,每个页面都有一个用户控件。

这确实是正确的方法。除了在ASP.NET MVC中没有用户/服务器端控件。您可以编写一个自定义的可重用HTML帮助程序来封装此功能,并在视图中调用此自定义帮助程序。例如:

@Html.RoleBasedTextBoxFor(x => x.SomeField, "Admin")

自定义帮助程序将仅检查当前经过身份验证的用户是否处于Admin角色并呈现文本框,如果不返回空字符串。

以下是这样一个示例助手的样子:

public static class HtmlExtensions
{
    public static IHtmlString RoleBasedTextBoxFor<TModel, TProperty>(
        this HtmlHelper<TModel> html,
        Expression<Func<TModel, TProperty>> expression,
        string roleName
    )
    {
        var user = html.ViewContext.HttpContext.User;
        if (!user.Identity.IsAuthenticated || !user.IsInRole(roleName))
        {
            // the user is not authenticated or is not in the required role
            return MvcHtmlString.Empty;
        }

        return html.TextBoxFor(expression);
    }
}

答案 1 :(得分:0)

如果您要查看视图中的角色that question has already been answered

虽然您可以在视图上使用Page.User.IsInRole("RoleName"),但最好让控制器控制用户流程。