Menu Recursivo

Hace mucho rato que no trabajaba con un menu recursivo, desde que trabaje en Tajamar/Travel Security que no veia uno :P , 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
  • 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 ;) .

2 comentarios to this post.

  1. Publicado por Carlos en Septiembre 16, 2009 at 5:58 pm

    Bien vitoco..no esperaba menos… ;)

  2. 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.

Contestar a esta entrada