Могу ли я сделать динамический рендер полагаться на разрешения пользователя в MVC 2? - PullRequest
0 голосов
/ 26 июля 2010

Я делаю систему безопасности в приложении MVC. В MVC это должно быть сделано AuthorizeAttribute и ролью через методы действий.

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

Ответы [ 5 ]

2 голосов
/ 26 июля 2010

В ваших представлениях вы можете выполнять условные проверки, такие как:

<% if (User.IsInRole("Admin")) { %>
    <a href="#">An Admin-only link</a>
<% } %>

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

<% var user = HttpContext.Current.User; %>

<% if (user.IsInRole("Admin")) { %>
    <a href="#">An Admin-only link</a>
<% } %>
1 голос
/ 26 июля 2010

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

просто мой «взгляд» на тему .. джим

0 голосов
/ 26 июля 2010

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

Позвольте мне привести простой пример

  1. Убедитесь, что ваши кнопки управления/ регионы определили классы css

класс css: РАБОТА С МОДУЛЕМ

например, Пользовательские операции модуля: Добавить, Изменить, Удалить, Список

<a href="/user/add" class="USER-ADD">Add User</a>

При каждом изменении (добавлении / обновлении / удалении) ролей вы создаете файл css для каждой роли, например, вы решаете, что только администраторы могут добавлять пользователей, поэтому генерируется этот css

// admin_css.css

.USER-ADD {display: none;}

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

0 голосов
/ 26 июля 2010

Спасибо всем за ваши ответы. Я вижу, что представление динамического рендеринга является плохой практикой в ​​приложениях MVC. Я привык думать, что могут быть какие-то библиотеки или шаблоны.

Кстати, когда я сказал своему премьер-министру, что строка с ролями - это обычный шаблон, он грустил: «Жесткий код !!!!». Сейчас я разрабатываю какой-то сервис WCF, с помощью которого я буду называться «Аппликатором авторизации»))).

0 голосов
/ 26 июля 2010

Вы можете сделать либо A, либо B

a) Создать частичные представления для различных элементов, которые меняются, и делать что-то вроде

<% if (HttpContext.Current.User.IsInRole("Administrator"))
   {
      Html.RenderPartial("AdminStuff");
   }
   else
   {
      Html.RenderPartial("RegularStuff");
   }
%>

b) Установить роль в ваших viewdata / viewmodelи использовать его в коде (не рекомендуется, поскольку представление действительно не должно содержать логики)

В контроллере

ViewData["Admin"] = HttpContext.Current.User.IsInRole("Administrator");

В представлении

<% if ((bool)ViewData["Admin"]) { %>
    <!-- Show admin stuff  -->
<% } %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...