Создание главного страницы страницы 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.

Надеюсь, это поможет любому, кто ищет простое и эффективное решение!