Как я могу создать представление, которое имеет разные дисплеи в зависимости от роли пользователя? - PullRequest
14 голосов
/ 03 января 2009

Я хочу создать представление, которое будет отображаться по-разному в зависимости от роли пользователя.

Должен ли я создать другое представление для разных ролей или я должен проверить роли на самой странице Veiw, а не в действиях?

Как мне проверить роль на странице просмотра?

Ответы [ 8 ]

26 голосов
/ 03 января 2009

Или я должен использовать проверить роли на Просмотр страницы сам, а не на действия, если это так, кто-то может показать мне плз как это проверить на странице просмотра

Вы должны сделать оба. Проверьте роли в действиях в качестве меры безопасности и проверьте роли в представлениях, чтобы включить / отключить определенные элементы управления.

На странице просмотра длинная форма проверки роли -

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");
   }
%>
5 голосов
/ 03 января 2009

Если отображение меняется в зависимости от роли - а изменение невелико - тогда я выполняю проверку в представлении. Если определенные представления ограничены в зависимости от роли, я бы сделал проверку в контроллере. Если представления совершенно разные (это трудно представить), тогда могут быть уместны отдельные представления для каждой роли.

Возможно, вы захотите абстрагировать определенные компоненты представления, относящиеся к роли, в частичные представления, чтобы упростить логику представления - в основном вам нужно только проверить, чтобы включить частичное представление или не основываться на роли.

Кроме того, кроме проверки «IsAuthenticated», я бы переместил логику проверки роли в контроллер и передал (в качестве данных) информацию о представлении, какие элементы включить / исключить на основе роли. Это предотвращает кровотечение из реальной бизнес-логики.

3 голосов
/ 03 января 2009

Если вы используете MVC, вся цель разработки состоит в том, чтобы держать логику вне поля зрения и в контроллере. Мне кажется, что на трассе разработки WebForms вам будет лучше, чем на MVC.

После всего этого я делаю проверку администратора на многих своих страницах, используя такую ​​проверку:

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

Но если вы пытаетесь встроить фактическую логику в представление, вам нужно выяснить, что вы можете отодвинуть назад к контроллеру для выполнения работы, и чтобы представление было настолько глупым, насколько это возможно, воздействуя на отправленные ему флаги.

2 голосов
/ 03 января 2009

Да, это меня тоже беспокоило ... но в то же время кажется смешным загружать совершенно другое представление для такого небольшого изменения.

Кстати как ты это настроил в своем контроллере. Прямо сейчас мой контроллер выглядит примерно так, как показано ниже, что я не считаю правильным.

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

    return View();
}
2 голосов
/ 03 января 2009

без исследования точного механизма asp.net, который mvc использует для ролей. Я бы крикнул "нет", чтобы представить какую-либо свою бизнес-логику в представлении, что вы делаете, если проверяете роли в представлении

0 голосов
/ 23 марта 2010

Мне нравится иметь полный контроль над этим в представлении, и я нахожу, что:

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

Работает для большинства сценариев. Он также позволяет легко выполнять условное форматирование для других ролей, например, «Content Manager», «Registered» и т. Д.

Мне нравится ответ Тодда Смита, потому что вы можете изменить имя роли администратора, и для этого потребуется только одно изменение, тогда как, если вы поместите строку «Супер пользователь» или «Администратор» непосредственно в представление, придется изменить его там, где вы использовали значение.

0 голосов
/ 13 августа 2009

У меня есть базовая модель, которая из всех остальных моделей распространяется. В этой модели я загрузил роли пользователя. Он основан на методе httpcontext.user.isinrole (). Все представления строго типизированы в расчете на базовый тип модели. Так что я всегда могу отметить во всех представлениях что-то вроде Model.CurrentUser.IsInRoles (Role1 | Role2). Конечно, не только в видах, но и в отверстиях.

0 голосов
/ 03 января 2009

Я не очень знаком с 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.

...