Как показать или скрыть элементы управления на основе ролей - 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")