-1

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

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

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

编辑:也许我应该将问题更正为这样的问题:如何避免将 <% if(...)%> 标签放入视图中并使用此处描述的方法,其中 CRice 说:“最好让viewdata或者model代表view要显示什么,view可以简单的检查view数据,一个controller基类或者一个action上的filter可以重复使用这个非常简单,让代码存在于一个地方。” 为了解决我的问题?

人们一直强调检查用户角色部分。事实上,当我问这个问题时,我已经知道这一点。我不知道如何以正确的方式使用视图数据或模型或任何适合此类情况的方法。(特别使用参考问题中描述的模型)

非常感谢您指导我完成这件事和您的耐心。

4

2 回答 2

1

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

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

@Html.RoleBasedTextBoxFor(x => x.SomeField, "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);
    }
}
于 2012-07-09T08:04:21.660 回答
0

如果您要检查视图中的角色,那么该问题已经得到回答

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

于 2012-07-07T19:35:39.513 回答