ASP.Net MVC Masquer / Afficher les éléments de menu en fonction de la sécurité

Je suis en train de travailler sur un ASP.Net MVC 3 site. Le _Layout vue maître contient un menu et je veux cacher certains éléments dans le menu en fonction de si vous êtes connecté et que les rôles que vous êtes dans.

Ce travaille actuellement à l'aide de ce code

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

Je tiens à refactoriser cette dans quelque chose de plus lisible et est venu avec quelque chose comme ceci

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

J'ai d'abord ajouté ce qui suit à mon contrôleur de base constructeur de penser que je pouvais le programme d'installation de la ViewData pour ces biens-là

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;

Cependant, il s'avère que l'objet Utilisateur est nul à ce point dans le cycle de vie. J'ai aussi essayé de créer un filtre global, mais la ViewData est donc pas accessible.

Quelle est la meilleure façon de faire quelque chose comme ça? Dois-je laisser juste la façon dont il a été dans un premier temps avec tous les HttpContext code dans la vue?

source d'informationauteur Gavin