如何根据用户的角色创建具有不同显示的视图?

Posted

技术标签:

【中文标题】如何根据用户的角色创建具有不同显示的视图?【英文标题】:How can I create a view that has different displays according to the role the user is in? 【发布时间】:2010-09-29 09:09:54 【问题描述】:

我想根据用户所处的角色创建一个具有不同显示的视图。

我应该为不同的角色创建不同的视图,还是应该在 Veiw 页面本身而不是在操作中检查角色?

如何在视图页面上查看角色?

【问题讨论】:

【参考方案1】:

或者我应该使用检查角色 Veiw page its self 而不是 on 行动,如果是这样,有人可以告诉我 如何在查看页面上进行检查

你需要两者都做。检查操作中的角色作为安全措施并检查视图中的角色以启用/禁用特定控件。

在您的视图页面中,检查角色的长格式是

HttpContext.Current.User.IsInRole("Administrator")

许多开发人员会创建页面帮助方法,以便您最终为您的应用程序提供更简洁的内容,例如

public static bool IsAdmin(this ViewUserControl pg)

    return pg.Page.User.IsInRole("Administrator")

那么在您看来,您可以只使用 this.IsAdmin()

为了让您的视图保持混乱,请考虑使用部分视图

<% if (IsAdmin())
   
      html.RenderPartial("AdminPanel");
   
   else
   
      Html.RenderPartial("UserPanel");
   
%>

【讨论】:

我也做了同样的事情,但我无法在控制器的视图中找到 IsAdmin..为什么会这样?? 是你自己添加的辅助方法。 或者你忘记了static声明函数的语句! 一旦您使用缓存,此解决方案就会中断,您应该使用缓存。【参考方案2】:

如果显示根据角色发生变化——而且变化很小——那么我会在视图中进行检查。如果某些视图基于角色受到限制,那么我会在控制器中进行检查。如果视图完全不同(这很难想象),那么每个角色的单独视图可能是合适的。

您可能希望将某些特定于角色的视图组件抽象为部分视图以简化您的视图逻辑——基本上您只需根据角色检查是否包含部分视图。

此外,除了检查“IsAuthenticated”之外,我会将角色检查逻辑移至控制器,并将(作为数据)传递给视图信息,以根据角色包含/排除哪些元素。这可以防止实际的业务逻辑渗入您的视图。

【讨论】:

在我的项目中我需要维护分支信息。系统管理员应该能够查看/维护所有分支信息。分支管理员应该只查看/维护他们自己的分支信息。我认为是两种不同的观点。【参考方案3】:

如果您使用的是 MVC,那么整个开发重点就是将逻辑保持在视图之外和控制器中。在我看来,WebForms 开发轨道比 MVC 轨道更好。

话虽如此,我使用这样的检查对我的很多页面进行了管理员检查:

<% if ((bool)ViewData["Admin"])  %>
    <!-- Show admin controls here -->
<%  %>

但是,如果您尝试将实际逻辑构建到视图中,那么您需要弄清楚您可以将什么推送回控制器来完成工作,并让视图尽可能愚蠢,并根据发送给它的标志进行操作。

【讨论】:

【参考方案4】:

如果不研究 asp.net mvc 用于角色的确切机制,我会尖叫不将您的任何业务逻辑放在视图中,如果您在视图中检查角色,那么您正在做的事情

【讨论】:

一般情况下我会同意这一点,但我并没有那么教条,以至于我坚持生成完全不同的视图只是为了根据用户的角色更改添加/删除特定元素。 【参考方案5】:

是的,这也让我感到困扰......但同时为这么小的变化加载完全不同的视图似乎很荒谬。

顺便说一句 你是如何在你的控制器中设置的。 现在,我的控制器看起来像下面的代码,我认为它不正确。

[Authorize(Roles = "Admin, Member")]
public ActionResult RegistrationInformation()


    return View();

【讨论】:

这是正确的,但我计划实现一个自定义 Authorize 类来证明枚举角色,例如 Roles.Admin |角色。成员。这样我就可以在编译时检查角色是否仍然存在。【参考方案6】:

我还不太熟悉 ASP.NET MVC,但你不能在视图中做一些条件过滤器吗?如果控制器将角色传递给视图,那么如果用户是管理员,您应该能够进行条件过滤并显示某个代码块。如果你想显示一个完全独立的页面,那么你会有多个视图,否则你可以使用一个并做一些有条件的。

在 Ruby on Rails 中会是这样的(抱歉,我还不知道 ASP.NET MVC):

<% if @user.admin? # is the user an admin %>
  <h3>Admin Tools</h3>
<% end %>
<p>Regular site content</p>

在 Rails 中,您可以从部分加载额外内容; ASP.NET MVC 有类似的东西,但我忘记了它叫什么。也许调查一下?

抱歉,我无法提供更多帮助 - 就像我说我还没有真正开始使用 ASP.NET MVC。

【讨论】:

【参考方案7】:

我有从所有其他模型扩展的基本模型。在这个模型中,我已经加载了用户的角​​色。它基于 httpcontext.user.isinrole() 方法。所有视图都是强类型的,需要基本模型类型。 所以我总是可以检查所有视图,比如 Model.CurrentUser.IsInRoles(Role1 | Role2)。当然不仅在视图中,而且在洞应用中。

【讨论】:

【参考方案8】:

我喜欢在视图中完全控制它,我发现:

<% if (User.IsInRole("Super User"))  %>
    <h1>Hello world!</h1>
<%  %>

适用于大多数情况。它还允许您轻松地为其他角色进行条件格式化,例如“内容管理员”、“已注册”等。

我确实喜欢 Todd Smith 的回答,因为您可能会更改管理员角色的名称,而这只需要更改一次,而如果您将“超级用户”或“管理员”字符串直接放在视图中,您无论您在哪里使用该值,都必须对其进行更改。

【讨论】:

以上是关于如何根据用户的角色创建具有不同显示的视图?的主要内容,如果未能解决你的问题,请参考以下文章

我应该如何应用 if-else 条件来向具有不同用户角色的人显示不同的菜单?

如何根据用户角色(尤其是可变产品)显示不同的产品价格? [复制]

相同的 URL 路径,但根据用户角色加载不同的组件 - Angular

Struts2 授权

Drupal Views 如何在具有相同路径的多个显示器之间做出决定

如何允许标签栏项具有多个视图控制器