2016-02-11 79 views
0

我有一個菜單,我從列表中填充,我希望子菜單動態顯示,具體取決於從列表返回的內容。目前,我可以顯示兩個級別,並且我可以繼續添加foreach循環以添加更多級別,但我希望能夠動態調整,以便菜單不受邏輯中循環數量的限制。如何使菜單動態增長C#

public string CreateDynamicMenu() 
     { 
      HtmlGenericControl navbar = new HtmlGenericControl("nav"); 
      navbar.Attributes.Add("class", "navbar navbar-default"); 
      HtmlGenericControl containerDiv = new HtmlGenericControl("div"); 
      containerDiv.Attributes.Add("class", "container-fluid"); 
      HtmlGenericControl collapseDiv = new HtmlGenericControl("div"); 
      collapseDiv.Attributes.Add("class", "collapse navbar-collapse"); 
      HtmlGenericControl navUl = new HtmlGenericControl("ul"); 
      navUl.Attributes.Add("class", "nav navbar-nav"); 

      // mainMenuA.Attributes.Add("href", "~/Default.aspx"); 

      var myMenu = menuListForUserG.GetMenus(Global.CurrentProfile.UserID).OrderBy(x => x.MenuOrder).ThenBy(y => y.MenuName); 
      var navbarmenu = myMenu.Where(x => x.ParentID == null); 

      foreach (var menuLevel1 in navbarmenu) 
      { 
       HtmlGenericControl dropdownLi = new HtmlGenericControl("li"); 
       dropdownLi.Attributes.Add("class", "dropdown"); 
       HtmlGenericControl mainMenuA = new HtmlGenericControl("a"); 
       mainMenuA.Attributes.Add("href", "~/Default.aspx"); 
       mainMenuA.InnerText = menuLevel1.MenuName; 
       dropdownLi.Controls.Add(mainMenuA); 



       var navbarsubmenu = myMenu.Where(x => x.ParentID == menuLevel1.MenuID); 
       if (navbarsubmenu.IsAny()) 
       { 
        HtmlGenericControl dropdownUl = new HtmlGenericControl("ul"); 

        dropdownUl.Attributes.Add("class", "dropdown-menu"); 
        foreach (var menuLevel2 in navbarsubmenu) 
        { 
         HtmlGenericControl dropdownsubmenuLi = new HtmlGenericControl("li"); 
         dropdownsubmenuLi.Attributes.Add("class", "dropdown-submenu"); 
         HtmlGenericControl subMenuA = new HtmlGenericControl("a"); 
         subMenuA.Attributes.Add("href", "~/Default.aspx"); 
         subMenuA.InnerText = menuLevel2.MenuName; 
         dropdownsubmenuLi.Controls.Add(subMenuA); 
         dropdownUl.Controls.Add(dropdownsubmenuLi); 
         dropdownLi.Controls.Add(dropdownUl); 
         navUl.Controls.Add(dropdownLi); 
        } 

       } 
      } 

      collapseDiv.Controls.Add(navUl); 
      containerDiv.Controls.Add(collapseDiv); 
      navbar.Controls.Add(containerDiv); 


      StringBuilder htmlStringBuilder = new StringBuilder(); 
      HtmlTextWriter htmlStringWriter = new HtmlTextWriter(new StringWriter(htmlStringBuilder)); 
      navbar.RenderControl(htmlStringWriter); 
      String output = htmlStringBuilder.ToString(); 
      return output; 
     } 
+2

你知道如何使用「遞歸」嗎? – Enigmativity

+0

您需要添加或重構您的方法以遞歸。具體而言,您將繼續構建菜單,直到您的查詢導致零孩子。 – pnm

+0

這就是我困惑的地方,我不確定那會是什麼樣子。 – Nakres

回答

1

我終於學會了如何使用遞歸。我在視圖中使用了一個助手類,它解決了這個問題。它是一個無限級的動態菜單。

@model IEnumerable<Menus> 

@helper GetSubMenus(IEnumerable<Menus> siteMenu, int? parentID) 
{ 
    foreach (var i in Model.Where(a => a.ParentID.Equals(parentID))) 
    {  
     <li class="@(i.ParentID.HasValue ? "dropdown-submenu" : "dropdown")"> 
      <a href="@(!string.IsNullOrEmpty(i.MenuLink) ? Url.Content(i.MenuLink) : "~/ADDS/Default.aspx")" style="@(i.ParentID.HasValue ? "" : "font-size:16px;")">@i.MenuName</a> 
      @if (Model.Any(a => a.ParentID.Equals(i.MenuID))) 
      {        
       <ul class="dropdown-menu"> 
        @GetSubMenus(siteMenu, i.MenuID) 
        @* Recursive Call for Populate Sub items here*@ 
       </ul> 
      } 
     </li> 
    } 
} 

@if (@Model.IsAny()) 
{ 
    <nav class="navbar navbar-default"> 
     <div class="container-fluid"> 
      <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> 
       <ul class=" nav navbar-nav"> 
        @GetSubMenus(@Model, @Model.First().ParentID) 
       </ul> 
      </div> 
     </div> 
    </nav> 
}