Создание главного страницы страницы ASP.NET MVC Динамически, исходя из текущей роли пользователя "Роль",
Я видел некоторые подобные вопросы, но ни один из них не похож на то, что я пытаюсь сделать.
Это моя текущая реализация без какой-либо защиты:
<div id="menucontainer">
<ul id="menu">
<li><%= Html.ActionLink("Main List", "Index", "AController")%></li>
<li><%= Html.ActionLink("Product List", "Index", "BController")%></li>
<li><%= Html.ActionLink("Company List", "Index", "CController")%></li>
<li><%= Html.ActionLink("User List", "Index", "DController")%></li>
</ul>
</div>
Это прекрасно, и все это работает. У меня есть [Авторизовать] настройку атрибутов в Actions for CController и DController для предотвращения несанкционированного доступа - но я хотел бы удалить эти элементы из меню для пользователей, у которых нет правильной роли, потому что когда они видят это и нажимают на нем, и он говорит им, что у них нет разрешения, они этого захотят. Если они этого не знают, это лучше для всех участников...
Что-то вроде этого в конечном итоге является целью, к которой я пытаюсь добраться, но я ищу более привлекательный MVC-апробак, где "вид" "тупой":
<div id="menucontainer">
<ul id="menu">
<li><%= Html.ActionLink("Main List", "Index", "AController")%></li>
<li><%= Html.ActionLink("Product List", "Index", "BController")%></li>
<% If(Role = Roles.Admin) { %>
<li><%= Html.ActionLink("Company List", "Index", "CController")%></li>
<li><%= Html.ActionLink("User List", "Index", "DController")%></li>
<% } %>
</ul>
</div>
Ответы
Ответ 1
Я сделал что-то вроде этого:
- используйте общий базовый класс для моих контроллеров ( "супертип уровня" )
- в BaseController, переопределите OnActionExecuted (для этого также можно определить атрибут ActionFilter)
Что-то вроде этого:
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
// build list of menu items based on user permissions, and add it to ViewData
IEnumerable<MenuItem> menu = BuildMenu();
ViewData["Menu"] = menu;
}
На главной странице:
<% var model = ViewData["Menu"] as IEnumerable<MenuItem>; %>
<% Html.RenderPartial("Menu", model); %>
(Примечание: в действительности у меня есть MasterViewModel, который содержит среди других модель меню)
Ответ 2
Вы слышали о MvcContrib MenuBuilder?
Если нет, я предлагаю вам взглянуть на него. Пример проекта UI
- это хороший способ начать изучение того, как его использовать.
Ответ 3
Никто не упоминал MvcSiteMapProvider, который делает это и может быть легко интегрирован в ваш проект Visual Studio с использованием NuGet.
Ответ 4
Обычно я просто проверяю роль аналогичным образом, а затем либо отрисовка частичного представления со ссылками, либо просто их создаю. Что-то вроде этого с использованием синтаксиса Razor. Я использую T4MVC для действий.
@if(User.IsInRole("Admin"))
{
<li><a href="@Url.Action(MVC.Admin.User.Index())">Users</a></li>
}
Для обеспечения безопасности я использую Fluent Security.
Надеюсь это поможет.
Ответ 5
Как и @SD, вы можете создать "блестящего" помощника, который либо визуализирует ссылку, либо нет, основываясь на вашем требовании безопасности.
Вот хорошее чтение пользовательских помощников (в нижней части):
help-html-helpers в блоге С. Вальтера
Ответ 6
Решение Джо было самым простым и сработало для меня. У меня есть страницы в отдельных областях, для которых мне нужно быстро настроить систему меню, которая реагирует и работает в зависимости от того, в какой области находится пользователь. Также в моем случае в моей системе нет межсетевых ссылок, поэтому я собираюсь next настроить несколько файлов Sitemap для MvcSiteMapProvider.
Надеюсь, это поможет любому, кто ищет простое и эффективное решение!