ASP.Net MVC Скрытие / отображение элементов меню на основе безопасности

Я работаю над ASP.Net Сайт MVC 3. Главное представление _Layout содержит меню, и я хочу скрыть некоторые элементы в меню в зависимости от того, вошли ли вы в систему и какие роли вы выполняете.

В настоящее время это работает с использованием такого кода

@if (HttpContext.Current.User.Identity.IsAuthenticated)
{
   <li id="MyLearningTab">@Html.ActionLink("My Learning", "MyLearning", "Learning")</li> 
   if (HttpContext.Current.User.IsInRole("Reporters"))
   {
      <li id="ReportTab">@Html.ActionLink("Reports", "Index", "Reports")</li>
   }
   if (HttpContext.Current.User.IsInRole("Administrators"))
   {
      <li id="DashboardTab">@Html.ActionLink("Dashboard", "Dashboard", "Admin")</li>
      <li id="AdminTab">@Html.ActionLink("Admin", "Index", "Admin")</li> 
   }
}

Я бы хотел чтобы преобразовать это в что-то более читаемое и придумал что-то вроде этого

@if ((bool)ViewData["MenuMyLearning"]){<li id="MyLearningTab">@Html.ActionLink("My Learning", "MyLearning", "Learning")</li> }    
@if((bool)ViewData["MenuReports"]){<li id="ReportTab">@Html.ActionLink("Reports", "Index", "Reports")</li>}
@if ((bool)ViewData["MenuDashboard"]){<li id="DashboardTab">@Html.ActionLink("Dashboard", "Dashboard", "Admin")</li>}
@if ((bool)ViewData["MenuAdmin"]){<li id="AdminTab">@Html.ActionLink("Admin", "Index", "Admin")</li>}

Я изначально добавил следующее в свой конструктор базового контроллера, думая, что могу настроить ViewData для этих свойств там

ViewData["MenuDashboard"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Administrators");
ViewData["MenuAdmin"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Administrators");
ViewData["MenuReports"] = User != null && User.Identity.IsAuthenticated && User.IsInRole("Reportors");
ViewData["MenuMyLearning"] = User != null && User.Identity.IsAuthenticated;

Однако оказывается, что объект User имеет значение null на этом этапе жизненного цикла. Я также пробовал создать собственный глобальный фильтр, но тогда ViewData недоступен.

Каков рекомендуемый способ сделать что-то подобное? Должен ли я просто оставить все как было сначала со всем кодом HttpContext в представлении?

15
задан Adam Lear 16 December 2011 в 06:21
поделиться