I've got an issue where I’m trying to generate menus based on a table, IE to link it to a user down the line. So simply, I’ve got some headers and any header can have items attached to them IE a menu item but a heading can also have nothing attached to it
until later down the line. I've just moved over to the c# side so apologies if it incredibly simple to answer, it's become my job to convert a lot to be dynamic instead of static.
table Design:
[Key]
public int MenuId { get; set; }
[Required]
public int pId {get; set;}
[Required]
public string MenuTitle { get; set; }
[Required]
public string HandlerURL { get; set; }
public string ParentID { get; set; }
public bool Header { get; set; }
public virtual User Users { get; set; }
In HTML i would do :
<nav id="mp-menu" class="mp-menu"><div class="mp-level"><h2>All Cat</h2><ul><li><a href="#">PC's</a><div class="mp-level"><h2>PC's</h2><ul><li><a href="#">Dell</a><div class="mp-level"><h2>Dell</h2><ul><li><a href="#">XPS</a></li><li><a href="#">Workstation</a></li></ul></div></li><li><!-- ... --></li><li><!-- ... --></li></ul></div></li><li><!-- ... --></li><!-- ... --></ul></div></nav>
My Code so far ![Cry Cry]()
var sb = new StringBuilder();
var subMenu = user.MenuModel.AsQueryable().Where(r => r.ParentID == "0").Select(l => new MenuModel { HandlerURL = l.HandlerURL, MenuId = l.MenuId, MenuTitle = l.MenuTitle, ParentID = l.ParentID, pId = l.pId });
IEnumerable<MenuModel> test01 = subMenu;
// IEnumerable<MenuModel> subMenu = table.AsQueryable().Where(r => r.ParentID == (string.Format("{0}", pid))).Select(l => l); //table.Select(String.Format("ParentId = {0}", pid));
IEnumerable<MenuModel> HeaderText1 = user.MenuModel.AsQueryable().Where(r => r.ParentID == (string.Format("{0}", "0"))).Where(r => r.Header == true).Select(l => l);
private String GenerateMenu1(IEnumerable<MenuModel> Heading,IEnumerable<MenuModel> menu, ICollection<MenuModel> table, StringBuilder sb)
{
string MenuLevel = string.Format(@"<div class=""mp-level"">");
sb.AppendLine(MenuLevel);
foreach (var dr in Heading)
{
string HeadingText = string.Format(@"<h2>{0}</h2>", dr.MenuTitle);
sb.AppendLine(HeadingText);
}
sb.AppendLine("<ul>");
foreach (var dr in menu)
{
sb.Append("<li>");
if (dr.Header != true)
{
string handler = dr.HandlerURL.ToString();
string menuText = dr.MenuTitle.ToString();
string line = String.Format(@"<a href=""{0}"">{1}</a>", handler, menuText);
sb.Append(line);
string pid = dr.pId.ToString();
IEnumerable<MenuModel> subMenu = table.AsQueryable().Where(r => r.ParentID == (string.Format("{0}", pid))).Select(l => l); //table.Select(String.Format("ParentId = {0}", pid));
IEnumerable<MenuModel> HeaderText1 = table.AsQueryable().Where(r => r.ParentID == (string.Format("{0}", pid))).Where(r => r.Header == true).Select(l => l);
//user.MenuModel.AsQueryable().Where(r => r.ParentID == "0").ToArray<MenuModel>;
if (IsNullOrEmptyExtension.IsNullOrEmpty(subMenu) == false)
{
var subMenuBuilder = new StringBuilder();
sb.Append(GenerateMenu1(HeaderText1,subMenu, table, subMenuBuilder));
}
}
sb.Append("</li>");
}
sb.Append("</div>");
sb.Append("</ul>");
return sb.ToString();
}Any Help would be much Appreciated, this is just how i thought to do it. if you have a better way feel free to tell me i'm being stupid..
Ben