ASP.NET MVC3 вид авторизации дизайн - PullRequest
4 голосов
/ 22 февраля 2012

Представьте, что у вас есть защищенный сайт и представление, которое можно создать несколькими способами, в зависимости от роли пользователя.Скажем, администратор видит все, менеджер видит некоторые столбцы и некоторые кнопки действий, пользователь видит другие столбцы и другие кнопки действий.

Как бы вы это реализовали?Насколько я понимаю, есть три основных варианта:

  • Контроллер с атрибутом [Authorize] и действием, возвращающим 1 представление для каждой роли пользователя, являясь теми представлениями, которые приспособлены к роли;
  • Контроллер с атрибутом [Authorize] и действием, возвращающим 1 View для всех ролей, с логикой для скрытия / отображения столбцов, полей, кнопок;
  • Контроллер с атрибутом [Authorize] и действием, возвращающим 1 View, которыйна основе ролей отрисовываются разные частичные представления.

Я предпочитаю третий подход, но вы видите лучший способ реализовать это?

Заранее спасибо

Ответы [ 2 ]

2 голосов
/ 22 февраля 2012

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

Если вы выберете третий вариант, вам следует рассмотреть возможность использования EditorTemplates и DisplayTemplates. Это позволит вам сделать ваш (основной) вид независимым от того, какой частичный вид визуализировать. Заставьте вашу модель представления (или ее часть) наследовать один базовый класс. Создайте шаблоны отображения и / или редактора для каждого типа модели представления, и, по вашему мнению, просто скажите Html.DisplayFor( ... ) или Html.EditorFor( ... ). MVC автоматически выберет правильный шаблон, без необходимости логики на ваш взгляд.

0 голосов
/ 22 февраля 2012

То, что я делал для меню и других элементов навигации, - это то, что у меня есть класс ViewModel для него. Вот упрощенная версия.

ViewModel

public class Action
{
    public string DisplayName { get; set; } // localized
    public string Url { get; set;
}

public class MenuViewModel
{
    public List<Action> Actions { get; set; }

    public MenuViewModel()
    {
        this.Actions = new List<Action>();
    }
}

Я заполняю это в зависимости от роли пользователя. Администратор получает больше ссылок и т. Д.

То, что ViewModel является частью "основной" модели вида

public class AlbumEditorViewModel
{
    public MenuViewModel Menu { get; set; }
}

Затем я передам эту модель представления для частичного представления, отвечающего за меню.

Вид (Razor)

@model AlbumEditorViewModel

.. razor stuff here ..
@Html.Partial("Menu", Model.Navigation)
.. razor stuff here ..

Частичное представление

@model MenuViewModel

<ul>
    @foreach (var action in Model.Actions)
    {
        <li>
            @GridHelper.GetAction(action)
        </li>
    }
</ul>

Я надеюсь, что это даст вам идеи

...