63 votes

asp.net MVC3 rasoir: afficher actionlink en fonction du rôle de l'utilisateur

Im nouveau à la MVC. Je veux être en mesure de cacher certains actionlinks pour certains utilisateurs. Dire que j'ai une "créer" actionlink qui je veux seulement des administrateurs et cliquez sur. Je veux utiliser une sorte de "loggedintemplate" disponible en asp.net mais il n'a pas l'air de travailler dans de rasoir..

Je pourrais utiliser une sorte de bloc de code avec une instruction si la vérification de l'utilisateur actuel et de son rôle, mais qui peuvent ne pas être les meilleures pratiques?

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();
}

cheers! :)

137voto

Richard Points 11249

Dans le passé j'ai créé une fonction d'assistance à seulement retour de sortie lorsqu'un critère est rencontré comme ceci:

public static MvcHtmlString If(this MvcHtmlString value, bool evaluation)
{
     return evaluation ? value : MvcHtmlString.Empty;
}

ainsi, vous pouvez utiliser ceci:

@Html.ActionLink("Create New", "Create").If(User.IsInRole("Administrators"))

De cette manière, il est lisible et court

42voto

Matthieu Points 2635

Si vous voulez un bloc de code, cela ne serait dans la vue :

@if (Roles.IsUserInRole("Administrators"))
{
  <li>@Html.ActionLink("Create New", "Create")</li>
}

7voto

Elan Hasson Points 372

J'ai modifié Richard de code à fournir une option de MvcHtmlString paramètre de retour si l'évaluation est faux.

public static MvcHtmlString If(this MvcHtmlString value, bool evaluation, MvcHtmlString falseValue = default(MvcHtmlString))
        {
            return evaluation ? value : falseValue;
        }

1voto

Oleksandr Lytvyn Points 376

La solution proposée par Richard est vraiment très beau, bien que Matthieu a noté que quelqu'un pourrait besoin de plus de code html à rendre (ou non rendu). Ainsi, Matthieu la solution semble être la plus largement applicable, je voudrais juste centraliser la logique à l'égard de laquelle les utilisateurs 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");
}

Utilisation:

@if (this.IsAdmin())
{
    <p>
        @Html.ActionLink("Create New Version", "Create")
    </p>
}

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X