Я работаю над сайтом 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 в данный момент жизненного цикла является нулевым. Я также попытался создать настраиваемый глобальный фильтр, но ViewData тогда недоступен.
Каков рекомендуемый способ сделать что-то подобное? Должен ли я просто оставить его, как это было сначала со всем кодом HttpContext в представлении?