Как создать представление с разными дисплеями в зависимости от роли, в которой находится пользователь?

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

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

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

Ответы

Ответ 1

Или я должен использовать проверку ролей на На первой странице, а не на действия, если так, может кто-нибудь мне показать как проверить, что на странице просмотра

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

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

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

Ответ 2

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

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

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

Ответ 3

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

Все, что было сказано, я проверяю Admin на многих своих страницах, используя проверку вроде этого:

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

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

Ответ 4

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

Ответ 5

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

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

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

    return View();
}

Ответ 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>
<% } %>

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

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