Как показать или скрыть элементы управления на основе ролей - ASP.NET MVC 4 Razor

Я работаю над приложением ASP.NET MVC 4. У меня есть панель мониторинга, и мои группы пользователей будут основаны на домене Windows Поэтому я использую проверку подлинности WIndows для аутентификации пользователей. Я создал примеры приложений, которые используют пользовательскую проверку подлинности, переопределяя функции AuthorizeAttribute, ActionFilterAttribute. Это хороший подход?

  • Какой атрибут лучше всего использовать для аутентификации?

У меня есть панель инструментов. Поэтому мне нужно показать или скрыть элементы управления на основе ролей.  Предположим, есть ли 3 сетки (таблица), если администратор входит в систему, он может видеть 3 сетки (таблицы). Но если пользователь службы поддержки входит в систему, он может видеть только 2 таблицы (таблицы).

Мой план состоит в создании частичных представлений для каждой сетки, и поэтому для каждого частичного представления будет Action и Controller. Будет база данных, и я укажу действия, которые каждая группа может выполнить. Чтобы я мог фильтровать запросы.

2 Как я могу скрыть или показать частичные представления на основе ролей?.

Я пробовал некоторые ссылки SO, но все они говорят о 2,3 ролях и были жестко закодированы. В моем случае роли могут отличаться, и мы используем db для настройки доступа к ролям.

Спасибо заранее.

Ответ 1

Я сделал что-то подобное. То, как я это сделал (может быть, не самый лучший)

- отправить логическое назад в представление

в контроллере:

bool showSection1 = true;
bool showSection2 = false;

ViewData["showSection1"] = showSection1;
ViewData["showSection2"] = showSection2;
/// may be better to use a viewmodel here rather than ViewData

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

@if((bool)ViewData["showSection1"])
{
    @{Html.RenderPartial("section1");}
}
@if((bool)ViewData["showSection2"))
{
    @{Html.RenderPartial("Section2");}
}

вам нужно будет сделать логику, чтобы установить логическое значение так, как вы хотите, но это должно быть начало.

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

@if(AppHelper.GetRole().equals("role1")){
    //show the partial
}

затем создайте класс под названием AppHelper и метод GetRole, который возвращает роль пользователя.

Ответ 2

Вы можете использовать следующий код для проверки на основе ролей

@if(Request.IsAuthenticated)

{
    if(User.IsInRole("Admin"))
    {
     <Ul Class="SubMenuItem">

     <li> this menu item is for Admin role</li>
     </Ul>
    }
     if(User.IsInRole("User"))
    {
     <Ul Class="SubMenuItem">

     <li> this menu item is for User role</li>
     </Ul>
    }
}
@* For unknown user *@
else
{
     <Ul Class="SubMenuItem">
         <li> this menu item is for Unknown user</li>
     </Ul>
}

Ответ 3

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

Вы можете использовать ChildActions и метод расширения Html.Action, чтобы получить это подключение.

Из MSDN:

Метод дочернего действия создает встроенную HTML-разметку для части представления вместо того, чтобы отображать весь вид. Любой метод, отмеченный ChildActionOnlyAttribute можно вызвать только с помощью действия или RenderAction HTML-методы расширения.

В вашем проекте создайте новый контроллер под названием Dashboard и добавьте одно действие под названием BuildTable.

public class DashboardController : Controller
{
    [ChildActionOnly]
    public ActionResult BuildTable()
    {
        if (Roles.IsUserInRole("Administrator"))
        {
            return PartialView("_AdminTable");
        }

        return PartialView("_SupportTable");
    }
}

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

@Html.Action("BuildTable", "Dashboard")