2016-02-10 5 views
3

Я создал многоуровневое меню в mvc. он работает, но я хочу сделать счет уровня неограниченным. Сейчас есть 4 уровня, поэтому в будущем, если кто-то хочет добавить 5. уровень в базу данных, он не появится в моем меню. Мне нужно добавить еще один цикл foreach для отображения уровня 5.. Итак, как я могу сделать мое меню неограниченным?Неограниченное многоуровневое меню в mvc

вот мое меню.

@{  
    var myMenu = @Model; 
    var navbarmenu = myMenu.Where(x => x.ParentID == null); 
    var i = 0; 
    <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"> 
        @foreach (var menuLevel1 in navbarmenu) 
        { 
         <li class="dropdown"> 
          <a href="~/ADDS/Default.aspx" style="font-size:16px;"> 
           @menuLevel1.MenuName 
           @if (menuLevel1.MenuName != "Home") 
           { 
            <span class="caret"></span> 
           } 
          </a> 
          @{ var navbarsubmenu = myMenu.Where(x => x.ParentID == menuLevel1.MenuID);} 
          @if (navbarsubmenu.IsAny()) 
          { 
           <ul class="dropdown-menu"> 
            @foreach (var menuLevel2 in navbarsubmenu) 
            { 
             <li class="dropdown-submenu"> 
              @if (!string.IsNullOrEmpty(menuLevel2.MenuLink)) 
              { 
               <a href="@Url.Content(menuLevel2.MenuLink)"> 
                @menuLevel2.MenuName 
               </a> 
              } 
              else 
              { 
               <a href="~/ADDS/Default.aspx"> 
                @menuLevel2.MenuName 
               </a> 
              } 
              @{var navbarsubmenu2 = myMenu.Where(x => x.ParentID == menuLevel2.MenuID);} 
              @if (navbarsubmenu2.IsAny()) 
              { 
               <ul class="dropdown-menu"> 
                @foreach (var menuLevel3 in navbarsubmenu2) 
                { 
                 <li class="dropdown-submenu"> 
                  @if (!string.IsNullOrEmpty(menuLevel3.MenuLink)) 
                  { 
                   <a href="@Url.Content(menuLevel3.MenuLink)"> 
                    @menuLevel3.MenuName 
                   </a> 
                  } 
                  else 
                  { 
                   <a href="~/ADDS/Default.aspx"> 
                    @menuLevel3.MenuName 
                   </a> 
                  } 
                  @{var navbarsubmenu3 = myMenu.Where(x => x.ParentID == menuLevel3.MenuID);} 
                  @if (navbarsubmenu3.IsAny()) 
                  { 
                   <ul class="dropdown-menu"> 
                    @foreach (var menuLevel4 in navbarsubmenu3) 
                    { 
                     <li class="dropdown-submenu"> 
                      @if (!string.IsNullOrEmpty(menuLevel4.MenuLink)) 
                      { 
                       <a href="@Url.Content(menuLevel4.MenuLink)"> 
                        @menuLevel4.MenuName 
                       </a> 
                      } 
                      else 
                      { 
                       <a href="~/ADDS/Default.aspx"> 
                        @menuLevel4.MenuName 
                       </a> 
                      } 
                     </li> 
                    } 
                   </ul> 
                  } 
                 </li> 
                } 
               </ul> 
              } 
             </li> 
            } 
           </ul> 
          } 
         </li> 
        } 
       </ul> 
      </div> 
     </div> 
    </nav> 
} 
+0

Использование иерархической модели и рекурсивную функцию - для примера с использованием метода расширения HtmlHelper см [этот ответ] (http://stackoverflow.com/questions/27146524/how-to-render-singly- link-list-in-mvc-view-page/27147744 # 27147744) –

ответ

1

Вы думали о попытке вспомогательного метода в вашем представлении? Что-то еще по этому поводу, используя рекурсию?

@helper GetSubMenus(IEnumerable<menutable> siteMenu, Nullable<int> parentID) 
{ 
    foreach (var i in Model.Where(a => a.ParentID.Equals(parentID))) 
    { 
     var submenu = Model.Where(a => a.ParentID.Equals(i.MenuID)).Count(); 

     <li class="@(submenu > 0 ? "dropdown-submenu" : "dropdown")"> 
      <a href="@(!string.IsNullOrEmpty(i.MenuLink) ? Url.Content(i.MenuLink) : "~/default)" style="font-size:16px;">@i.MenuName</a> 
      @if (submenu > 0) 
      { 
       <ul class="dropdown-menu"> 
        @GetSubMenus(siteMenu, i.MenuID) 
        @* Recursive Call for Populate Sub items here*@ 
       </ul> 
      } 
     </li> 
    } 
} 

@{ 
    var mymenu = @Model; 
    var menuParentID = mymenu.First().ParentID; 
} 
@if (mymenu != null && mymenu.Count() > 0) 
{ 
    <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(mymenu, menuParentID) 
       </ul> 
      </div> 
     </div> 
    </nav> 
} 
3

Я хотел бы сделать модель MultiLevelMenu, которая будет населена базой данных в слое службы, можно затем использовать частичные представления.

public class MultiLevelMenu 
{ 
    public string MenuName { get; set; } 
    public MultiLevelMenu NestedMenu { get; set; } 
} 

Затем в главном окне есть:

@model MultiLevelMenu; 

<div>@Model.MenuName</div> 

@Html.Partial("_MultiLevelMenu", Model); 

Тогда для частичного вида:

@if (Model.MultiLevelMenu != null) 
{ 
    <div>@Model.MenuName</div> 
    @Html.Partial("_MultiLevelMenu", Model); 
} 
+0

Я просто пытаюсь изменить свой код, я хочу сделать его неограниченным. – Nakres