Hace mucho rato que no trabajaba con un menu recursivo, desde que trabaje en Tajamar/Travel Security que no veia uno
, pero en un proyecto reciente tuve que volver a generar un menu recursivamente y aqui dejo respaldo de la logica base usada.
En resumen se trata de generar una lista recursiva de items con una estructura como la siguiente:
- Modulo 1
- Opcion 1
- Opcion 2
- Modulo 2
- SubModulo 2
- Opcion 3
- Opcion 4
- Opcion 5
- SubModulo 2
- Modulo 3
- Opcion 6
- Opcion 7
Para lo anterior tengo dos clases, una con la estructura de la tabla de la base de datos que maneja la info de los objetos del menu del sistema, y otra clase que usare solo para generar la lista recursiva anteriormente mencionada.
public class SecObjeto
{
public Int32 IdObjeto { get; set; }
public Int32 IdPadre { get; set; }
public String Controller { get; set; }
public String Action { get; set; }
public String NombreModulo { get; set; }
public SecObjeto(){ }
public SecObjeto(int idobjeto, int idpadre, string controller, string action, string nombremodulo)
{
IdObjeto = idobjeto;
IdPadre = idpadre;
Controller = controller;
Action = action;
NombreModulo = nombremodulo;
}
}
public class MenuList
{
public String UrlView { get; set; }
public String Name { get; set; }
public List<MenuList> SubMenu { get; set; }
public MenuList(string urlview,string name,List<MenuList> submenu)
{
UrlView = urlview;
Name = name;
SubMenu = submenu;
}
}
public static List<MenuList> GenerarMenu(List<SecObjeto> secObjetos)
{
var menuList = new List<MenuList>();
foreach (var sObj in secObjetos)
{
//0 indica que se trata de un nodo padre
if (sObj.IdPadre == 0)
{
//uri para accesar una view bajo el patron mvc
var urlAction = sObj.Controller + "/" + sObj.Action;
menuList.Add(new MenuList(urlAction, sObj.NombreModulo, GenerarSubMenu(secObjetos, sObj)));
}
}
return menuList;
}
public static List<MenuList> GenerarSubMenu(List<SecObjeto> secObjetos, SecObjeto sObj)
{
var menuList = new List<MenuList>();
foreach (var objeto in secObjetos)
{
//la igualdad indica que objeto es hijo de sObj
if (objeto.IdPadre == sObj.IdObjeto)
{
var urlAction = objeto.Controller + "/" + objeto.Action;
menuList.Add(new MenuList(urlAction, objeto.Descripcion, GenerarSubMenu(secObjetos, objeto)));
}
}
return menuList;
}
Con esto ya tengo una lista recursiva (List) con todo lo necesario para generar mi menu con html,jquery y css por ejemplo
.
Publicado por Carlos en Septiembre 16, 2009 at 5:58 pm
Bien vitoco..no esperaba menos…
Publicado por Victor Hugo Saavedra en Septiembre 21, 2009 at 3:45 pm
Excelente Victor, estas cosas siempre uno las hace una vez, y despues anda vuelto loko por que tiene que hacer lo mismo. y no recuerda bien como lo hizo.
Esta muy bueno el blog. Felicitaciones.
–
Atte.
Víctor Hugo Saavedra.