Aspirador asp.net MVC3: mostrar actionlink basado en el rol del usuario

Soy nuevo en MVC. Quiero ser capaz de ocultar algunos enlaces de acción para algunos usuarios. Digamos que tengo un actionlink de “crear” que solo quiero que los administradores vean y hagan clic. Quiero usar algún tipo de “loginintemplate” disponible en asp.net, pero no parece funcionar en razor.

Podría usar algún tipo de bloque de código con una statement if que verifique el usuario actual y su rol, sin embargo, ¿cuál puede no ser la mejor práctica?

mi index.cshtml ..

// want some adminauth attribute here... @Html.ActionLink("Create New", "Create") 

mi controlador …

 // GET: /Speaker/Create [Authorize(Roles = "Administrators")] public ActionResult Create() { return View(); } 

    En el pasado, creé una función auxiliar para solo devolver resultados cuando se cumple un criterio como este:

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

    para que puedas usar esto:

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

    De esta manera es legible y corto

    Si quieres un bloque de código, eso sería bueno en la vista:

     @if (Roles.IsUserInRole("Administrators")) { 
  • @Html.ActionLink("Create New", "Create")
  • }

    Modifiqué el código de Richard para proporcionar un parámetro MvcHtmlString opcional para devolver si la evaluación es falsa.

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

    Si no ha habilitado roleManager y aún desea verificar el rol del usuario, puede hacerlo así:

      @if (@User.IsInRole("administrator")) { @Html.ActionLink("Create New Version", "Create") } 

    Lo que estamos haciendo aquí es que estamos accediendo a las propiedades del usuario. Esto puede ser útil si está administrando roles usted mismo.

    La solución sugerida por Richard es realmente hermosa, aunque como Matthieu notó que alguien podría necesitar código html adicional para ser renderizado (o no renderizado) también. Por lo tanto, la solución de Matthieu parece ser más aplicable, simplemente centralizaría la lógica con respecto a qué usuarios se consideran administradores en el método de extensión.

    Método de extensión:

     public static bool IsAdmin(this WebViewPage page) { return page.User.IsInRole(@"Domain\ProjectAdmins"); } 

    Uso:

     @if (this.IsAdmin()) { 

    @Html.ActionLink("Create New Version", "Create")

    }

    Puede agregar una función a App_Code / ViewFunctions.cshtml (crear si falta)

     @using System.Web.Mvc; @functions{ public static object ConditionalActionLink(object actionLink, ICollection arrAuthUsers) { bool objIsVisible = arrAuthUsers .Select(s => User.IsInRole(s)) .Where(s => s.Equals(true)) .Any(); return (objIsVisible) ? actionLink : MvcHtmlString.Empty; } 

    Para usar esa función simplemente agregue el siguiente código a la vista.

     @ViewFunctions.ConditionalActionLink( @Html.ActionLink("TextToDisplay", "SomeAction", new { Area = "SomeArea", Controller = "SomeController" }), new string[] { "administrator","jDoe", "someOtherUser" })