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

时间:2009-01-03 15:31:26

标签: asp.net asp.net-mvc roles

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

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

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

8 个答案:

答案 0 :(得分:26)

  

或者我应该使用检查角色   Veiw页面是自己而不是   行动,如果是这样,有人可以告诉我   如何在视图页面上检查

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

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

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");
   }
%>

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:3)

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

所有这一切,我使用这样的支票对我的很多页面进行管理员检查:

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

但是如果你试图在视图中构建实际逻辑,那么你需要弄清楚你可以推回到控制器做什么工作并让视图尽可能愚蠢,对发送给它的标志采取行动。

答案 3 :(得分:2)

没有研究asp.net mvc用于角色的确切机制我会尖叫没有把你的任何业务逻辑放在视图中,如果你在视图中检查角色你正在做什么

答案 4 :(得分:2)

是的,这也困扰着我......但与此同时,为这么小的变化加载完全不同的观点似乎很荒谬。

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

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

    return View();
}

答案 5 :(得分:0)

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

在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中,您将从partials加载额外的内容; ASP.NET MVC有类似的东西,但我忘了它的名字。也许看看那个?

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

答案 6 :(得分:0)

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

答案 7 :(得分:0)

我希望在视图中完全控制它,我发现:

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

适用于大多数情况。它还允许您轻松地为其他角色执行条件格式设置,例如“Content Manager”,“Registered”等。

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