Динамическое построение меню главной страницы ASP.NET MVC на основе «роли» текущего пользователя - PullRequest
15 голосов
/ 05 февраля 2010

Я видел несколько похожих вопросов, но ни один из них не похож на то, что я пытаюсь сделать.

Это моя текущая реализация без какой-либо защиты:

<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>

Это нормально, и выше работает. У меня есть настройка [Авторизовать] Атрибуты в Действиях для CController и DController, чтобы предотвратить несанкционированный доступ - но я хотел бы удалить эти пункты из меню для пользователей, которые не имеют правильную роль, потому что когда они видят ее и нажимают и это говорит им, что у них нет разрешения, они захотят этого. Если они не знают, что это там, это просто лучше для всех участников ...

Нечто подобное, в конечном счете, является целью, к которой я стремлюсь, но я ищу более приукрашенный подход MVC, где "view" - "тупой":

<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>

Ответы [ 6 ]

15 голосов
/ 05 февраля 2010

Я сделал что-то вроде этого:

  • использовать общий базовый класс для моих контроллеров ('layer supertype')
  • в BaseController переопределить OnActionExecuted (для этого вы также можете определить атрибут ActionFilter)

Примерно так:

    protected override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        // build list of menu items based on user's 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 голосов
/ 29 ноября 2012

Никто не упоминал MvcSiteMapProvider , который делает это и может быть легко интегрирован в ваш проект Visual Studio с помощью NuGet.

2 голосов
/ 05 февраля 2010

Вы слышали о MvcContrib MenuBuilder?

Если нет, я предлагаю вам взглянуть на это. Пример проекта UI - хороший способ начать изучать его использование.

1 голос
/ 22 мая 2012

Обычно я просто проверяю роль аналогично тому, как вы это делали, а затем либо визуализирую частичное представление со ссылками, либо просто создаю их. Примерно так, используя синтаксис Razor. Я использую T4MVC для действий.

@if(User.IsInRole("Admin"))
{
    <li><a href="@Url.Action(MVC.Admin.User.Index())">Users</a></li>
}

В целях безопасности я использую Fluent Security. Надеюсь это поможет.

0 голосов
/ 29 января 2014

Решение Джо, безусловно, было самым простым и сработало для меня. У меня есть страницы в отдельных областях, для которых мне нужно быстро настроить систему меню, которая реагирует и работает в зависимости от того, в какой области присутствует пользователь. Также в моем случае нет перекрестных ссылок в моей системе, поэтому я собираюсь далее настроить несколько карт сайта для MvcSiteMapProvider .

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

0 голосов
/ 05 февраля 2010

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

Вот хорошая статья о пользовательских помощниках (внизу):

понимание-HTML-помощники в блоге С. Вальтера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...