Je suis nouveau sur MVC. Je veux pouvoir masquer certains liens d'action pour certains utilisateurs. Disons que j'ai un lien d'action "créer" que je veux seulement que les administrateurs voient et cliquent. Je veux utiliser une sorte de "modèle connecté" disponible sur asp.net, mais cela ne semble pas fonctionner avec le rasoir.
Je pourrais utiliser une sorte de bloc de code avec une instruction if vérifiant l'utilisateur actuel et son rôle, mais ce n'est peut-être pas la meilleure pratique?
mon index.cshtml ..
// want some adminauth attribute here...
@Html.ActionLink("Create New", "Create")
mon contrôleur ..
// GET: /Speaker/Create
[Authorize(Roles = "Administrators")]
public ActionResult Create()
{
return View();
}
Dans le passé, j'ai créé une fonction d'aide pour renvoyer uniquement la sortie lorsqu'un critère est rempli comme ceci:
public static MvcHtmlString If(this MvcHtmlString value, bool evaluation)
{
return evaluation ? value : MvcHtmlString.Empty;
}
vous pouvez donc utiliser ceci:
@Html.ActionLink("Create New", "Create").If(User.IsInRole("Administrators"))
De cette façon, il est lisible et court
Si vous voulez un bloc de code, cela ferait dans la vue:
@if (Roles.IsUserInRole("Administrators"))
{
<li>@Html.ActionLink("Create New", "Create")</li>
}
J'ai modifié le code de Richard pour fournir un paramètre MvcHtmlString facultatif à renvoyer si l'évaluation est fausse.
public static MvcHtmlString If(this MvcHtmlString value, bool evaluation, MvcHtmlString falseValue = default(MvcHtmlString))
{
return evaluation ? value : falseValue;
}
Si vous n'avez pas activé roleManager
et que vous souhaitez toujours vérifier le rôle de l'utilisateur, vous pouvez le faire comme ceci:
@if (@User.IsInRole("administrator"))
{
@Html.ActionLink("Create New Version", "Create")
}
Ce que nous faisons ici, c'est que nous accédons simplement aux propriétés de l'utilisateur. Cela peut être utile si vous gérez vous-même les rôles.
Vous pouvez ajouter une fonction à App_Code/ViewFunctions.cshtml (créer si manquant)
@using System.Web.Mvc;
@functions{
public static object ConditionalActionLink(object actionLink, ICollection<string> arrAuthUsers)
{
bool objIsVisible = arrAuthUsers
.Select(s => User.IsInRole(s))
.Where(s => s.Equals(true))
.Any();
return (objIsVisible)
? actionLink
: MvcHtmlString.Empty;
}
Pour utiliser cette fonction, ajoutez simplement le code suivant à la vue.
@ViewFunctions.ConditionalActionLink(
@Html.ActionLink("TextToDisplay", "SomeAction", new { Area = "SomeArea", Controller = "SomeController" }),
new string[] { "administrator","jDoe", "someOtherUser" })
La solution suggérée par Richard est vraiment belle, bien que, comme Matthieu l'a noté, quelqu'un puisse également avoir besoin de code HTML supplémentaire pour être rendu (ou non rendu). Ainsi, la solution de Matthieu semble être plus largement applicable, je voudrais simplement centraliser la logique concernant les utilisateurs qui sont considérés comme des administrateurs dans la méthode d'extension.
Méthode d'extension:
public static bool IsAdmin(this WebViewPage page)
{
return page.User.IsInRole(@"Domain\ProjectAdmins");
}
Usage:
@if (this.IsAdmin())
{
<p>
@Html.ActionLink("Create New Version", "Create")
</p>
}