tag route net for data asp all asp.net-mvc-4 navigation roles asp.net-mvc-partialview

asp.net mvc 4 - route - Navegación basada en roles



tag helpers asp net core (1)

He estado tratando de encontrar una forma de crear una solución de navegación dinámica basada en roles para un proyecto en el que estoy trabajando.

La navegación debería mostrar solo enlaces relacionados con el rol del usuario, por ejemplo: un administrador tendrá enlaces para ver estadísticas de aplicaciones, administrar cuentas de clientes, ect ... mientras que un usuario estándar tendría enlaces para administrar su cuenta, comunicarse con amigos , ect ..

Actualmente tengo una sola vista parcial llamada navegación con algunas declaraciones condicionales básicas para la verificación de roles y una combinación de marcas para mostrar los enlaces apropiados. Esto funciona, pero sé que podría volverse inmanejable rápidamente.

Vista parcial de navegación:

@if(User.IsInRole("Admin")) { <li><a href="#">Statistics</a></li> <li><a href="#">Accounts</a></li> <li><a href="#">Dashboard</a></li> } @if(User.IsInRole("User")) { <li><a href="#">Account</a></li> <li><a href="#">Friends</a></li> } // code omitted

¿Hay alguna manera de sacar esta lógica de la vista y dejar que el controlador maneje esto?


SOLUCIÓN

Como se sugirió, creé un ChildAction llamado Menú y vistas parciales para cada función. Dentro de la acción realizo algunas comprobaciones de roles usando algunas sentencias condicionales y visualizo la vista apropiada.

Esto mantiene las declaraciones condicionales fuera de las vistas, lo que la convierte en una solución mucho más limpia.

Estoy seguro de que hay algunas cosas que podrían hacerse para arreglarlo y continuaré tratando de mejorarlo.

Aquí está la solución que usé.

En la vista de diseño donde quería que aparezca el menú, lo usé.

@Html.Action("Menu", "Navigation")

Luego creé un controlador llamado Navegación y agregué una sola Acción llamada Menú.

public class NavigationController : Controller { [ChildActionOnly] public ActionResult Menu() { if (Roles.IsUserInRole("Administrator")) { return PartialView("_NavigationAdmin"); } return PartialView("_NavigationPublic"); } }