Skip to main content

Menús

Visión general

El sistema de menús de Crono construye los árboles de navegación del backend (y del sitio público). Un menú se compone de nodos jerárquicos MenuElemento que se resuelven a URLs finales. Los elementos pueden provenir de la base de datos (menús de usuario) o generarse por código a través de proveedores de menú.

Cargar y renderizar

Usa IMenuServicio para obtener un menú y pasarlo al componente de vista o al tag helper:

public class EncabezadoViewComponent : ViewComponent
{
private readonly IMenuServicio _menuServicio;

public EncabezadoViewComponent(IMenuServicio menuServicio)
{
_menuServicio = menuServicio;
}

public async Task<IViewComponentResult> InvokeAsync()
{
var menu = await _menuServicio.ObtenerMenuAsync("Principal");
return View(menu);
}
}

IMenuServicio también expone ObtenerNodoRaizAsync(nombreMenu) para obtener el árbol de nodos (ArbolNodo<MenuElemento>) y ResolverCantidadElementosAsync(...) para resolver contadores (badges) de los elementos.

Construir menús por código

Los módulos aportan elementos implementando IMenuProveedor. La interfaz declara el nombre del menú al que contribuye (NombreMenu) y el método ConstruirMenu que recibe el nodo raíz del árbol:

public class AdminMenuProveedor : IMenuProveedor
{
public string NombreMenu => "Admin";

public void ConstruirMenu(ArbolNodo<MenuElemento> nodoRaiz)
{
var elemento = new MenuElemento
{
Texto = "Demo",
Icono = "fa fa-rocket"
// Acción / controlador / área, o una expresión de enlace
};

nodoRaiz.Agregar(elemento);
}
}

Los proveedores se descubren por inyección de dependencias y se ejecutan al construir el menú. Al terminar todos los proveedores se publica un evento de "menú construido" (ver Eventos) que permite hacer ajustes de último momento. La invalidación de la caché de menús al cambiar sus entidades la manejan MenuInterceptor y MenuElementoInterceptor (ver Interceptores).

info

Un elemento de menú solo debería mostrarse si el usuario tiene el permiso correspondiente. Asocia uno o más permisos al elemento para que el enlace aparezca únicamente cuando el permiso esté concedido (ver Seguridad).

Resolución de enlaces

Los elementos de menú guardan su destino como expresiones de enlace, que el resolvedor de enlaces traduce a URLs absolutas. Los proveedores integrados manejan rutas MVC, enlaces a entidades y URLs externas (ver Resolvedor de enlaces).

Menús definidos por el usuario

Los administradores pueden crear menús desde el backend. El selector de enlaces guarda los destinos como expresiones que consume el resolvedor de enlaces. Estos menús se persisten en la base de datos y se renderizan con el componente de menú.