构建我在视图字段上执行用户权限的方式的更好方法

时间:2011-01-12 20:03:50

标签: c# .net asp.net-mvc permissions html-helper

因此,目前在我们的代码中,我们有许多类可以访问登录到Web应用程序的特定用户的角色和权限。这个很好,很好用。但是,现在出现的某个要求不仅是将某些页面(整个视图)限制为某些权限的能力,还包括这些视图上的特定字段。因此,您可能能够查看视图,但您可能只拥有一个权限,可以让您查看该页面上的某些字段。

我们在ASP.NET / C#中使用HTML Helpers生成大部分字段。例如,根据权限我们需要阻止/显示这个:

<%= Html.CheckBoxFor(m => m.Current, new { @class = "economicTextBox", propertyName = "Current", onchange = "UseCurrent();UpdateField(this);" })%>

我的第一个想法就是在此之前对类似的嵌入式C#代码中的权限进行检查,并将HTML Helper放在“if”语句中,因此只有在用户拥有权限时才会呈现。当我看到前端在我的脑海中充满了所有这些陈述时,我第二次猜到了自己,并且认为可能有更好的方法来做到这一点。

你们中的任何人都可以推荐什么吗?感谢。

2 个答案:

答案 0 :(得分:2)

将用户权限作为模型的单独模块。创建包含要显示/隐藏的代码块的部分视图。将模块传递给局部视图,让视图保持显示内容的逻辑。

这应该意味着你可以在局部视图中创建一个逻辑块,决定是一些基本的ifs或开关,并标记显示它更加清晰和易于管理。

例如,假设您创建了一个所有页面模型都继承的权限模型,从而确保您可以将相同的权限传递给所有页面。然后,您可以调用视图并将模型传递给它:

<%Html.RenderPartial("Widgets/NavigationUserControl"); %>

这将保留用户导航的标记和逻辑。在这个局部视图中,您可以继承权限对象:

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<WebApp.Web.Models.Permissions>" %>

然后你可以在标记中执行更基本的逻辑,或者让html帮助程序执行grunt工作并返回一些枚举/属性以获得更基本的代码来做决定。例如;

<%
if (Model.User.IsAdmin)
{
%>
...html...
<%
}
else
{
%>
...html...
<%
}
%>

答案 1 :(得分:2)

  

我的第一个念头就是玩   检查类似的权限   在此之前嵌入了C#代码   把HTML Helper放在“if”中   声明,所以它只会渲染   用户有权限。我第二个   当我看到前方时猜到了自己   所有的结局变得非常臃肿   这些陈述在我的脑海里,而且   以为可能有更好的方法   做到这一点。

if 放在 Html Helper中,并将帮助函数传递给执行条件检查所需的数据。

查看:

<body>
  <p>text</p>
  <%: Html.PermissionControlledFieldOne(someUserData, otherData) %>

助手:

public HtmlString PermissionControlledFieldOne(....) {
  if (performSecurityCheck(someUserData, otherData)) {
    // .. render partial or build html or whatever you need
  }