16

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

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

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

4

8 回答 8

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");
   }
%>
于 2009-01-03T16:24:40.313 回答
6

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

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

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

于 2009-01-03T16:09:51.763 回答
3

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

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

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

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

于 2009-01-03T15:53:52.717 回答
2

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

于 2009-01-03T15:46:30.390 回答
2

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

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

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

    return View();
}
于 2009-01-03T16:28:21.803 回答
0

我对 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。

于 2009-01-03T15:53:24.573 回答
0

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

于 2009-08-13T19:02:34.327 回答
0

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

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

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

I do like Todd Smith's answer, because you might change the name of the Admin role, and that will require only one change, whereas, if you put the "Super User" or "Administrator" string directly in the view, you will have to change it wherever you've used the value.

于 2010-03-23T15:20:22.830 回答