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
Vous devez vous connecter pour publier un commentaire.
Des conseils généraux sur les rôles
La façon dont je l'ai fait c'est de créer une entité personnalisée et à stocker le supplément requis les informations là-bas. Dans votre exemple, ce serait au moins inclure les rôles de l'utilisateur. De cette façon, vous éviter de faire beaucoup de voyages au magasin d'utilisateur (qui est probablement une base de données SQL).
Ont un coup d'oeil a cette question de la mine, à qui je donne le code que j'utilise avec succès: Est-ce de l'entité Personnalisée dans la Base de Contrôleur ASP.NET MVC 3 terriblement inefficace?
Remarque que je suis le stockage de l'entité personnalisée dans le cache plutôt que dans la session (juste d'être paranoïaque à propos de détournement de session).
J'aime cette approche, car il est très extensible. Par exemple, depuis, j'ai étendu cette exposer Facebook informations d'identification lorsque l'utilisateur se connecte via Facebook.
Souvenez-vous que si vous êtes à la mise en cache des données, vous devez vous rappeler de le mettre à jour lors du changement de!
Réponse à votre question
Juste pour ajouter, dans votre cas particulier, vous devriez probablement stocker cette information supplémentaire dans un
ViewModel
et puis votre point de vue, dire des choses comme:avec le Dernier Code en disant quelque chose comme:
J'ai effectivement tendance à prendre un peu plus loin et créer un
ReportsLink
dans monViewModel
et définir pour contenir le lien si l'utilisateur est autorisé ou à une chaîne vide si ils ne le sont pas. Puis la vue juste dit:Dans ce cas, la partie pertinente de la ViewModel peut-être comme ceci:
Voici ce que j'ai fait. J'ai créé une classe d'assistance appelé MenuSecurity avec statique de propriétés booléennes pour chaque élément de menu indiquant les articles qui doivent être visibles. Chaque propriété était comme ça
J'ai ensuite rangé mon menu vue partielle de ressembler à ce