2013-05-12 68 views
2

我想通过多级动态菜单进行循环。我已经成功地做到这一点手动,即每次如果要显示其父母的孩子Menus,我必须手动循环。 我想知道通过这些动态菜单循环多层次的最佳方式或替代方法 这是我迄今为止所做的;在Asp.Net MVC中循环多级动态菜单

@{ var menusList = ViewBag.Menus as IEnumerable<ParentMenuViewModel>; } 
@foreach (var parentMenu in menusList.Where(p => p.ParentId == 0)) 
{ 
    <ul> 
     <li> 
      <h1>@parentMenu.Name</h1> 
      @if (menusList.Count(p => p.ParentId == parentMenu.MenuId) > 0) 
      { 
       <ul> 
        @foreach (var childMenu in menusList.Where(p => p.ParentId == parentMenu.MenuId)) 
        { 
         <h2>@childMenu.Name</h2> 
         if (menusList.Count(p => p.ParentId == childMenu.MenuId) > 0) 
         { 
          foreach (var subChild in menusList.Where(p => p.ParentId == childMenu.MenuId)) 
          { 
           <h3>@subChild.Name</h3> 
          } 
         } 
        } 
       </ul> 
      } 
     </li> 
    </ul> 

} 

UPDATE:输出看起来是这样的;

HOME 
SUB MENU1 
    SUB SUB MENU1 
    SUB SUB MENU2 

但是,我在我的数据库中有这样的东西;

HOME 
SUB MENU1 
    SUB SUB MENU1 
    SUB SUB MENU2 
    Sub SUB SUB MENU1 
    Sub SUB SUB MENU2 

这是我的模型;
enter image description here

回答

5

您可以使用partialview然后做一个递归循环。为了做到这一点你首先需要改变你的模型中位:

视图模型

// The ViewModel is now a hirearchical model, where each item has a list of children. 
public class MenuViewModel 
{ 
    int MenuId {get; set;} 
    string Name {get; set;} 
    //other properties 
    ** snip ** 
    List<MenuViewModel> Children {get; set;} 
} 

控制器

变换模式进入层次视图模型:

public ActionResult Menus(){ 
    List<Menu> menusource; // get your menus here 
    ViewBag.Menus = CreateVM(0, menusource); // transform it into the ViewModel 
    return View(); 
} 

public IEnumerable<MenuViewModel> CreateVM(int parentid, List<Menu> source) 
{ 
    return from men in source 
      where men.ParentId = parentid 
      select new MenuViewModel(){ 
         MenuId = men.MenuId, 
         Name = men.Name 
         // other properties 
         Children = CreateVM(men.MenuId, source) 
        }; 
} 

查看

@{ 
    var menusList = ViewBag.Menus as IEnumerable<MenuViewModel>; 
    Html.RenderPartial("MenuPartial", menuslist); 
} 

MenuPartial

@model IEnumerable<MenuViewModel> 

@foreach (var menuitem in model) 
{ 
    <ul> 
     <li> 
      <h1>@menuitem.Name</h1> 
      @{ 
       Html.RenderPartial("MenuPartial", menuitem.Children); 
      } 
     </li> 
    </ul> 
} 

,你会在这里与问候你的原始代码唯一缺少的是,你不必不同HX-标签,但你能找到一种方法通过创建另一个视图模型并将其传递给当前级别。

注意:我在SO编辑器中输入了所有这些代码,所以可能会有一些小的语法错误。

+1

根据我的需要修改它,它工作。谢谢 – 2013-05-12 10:54:13

+0

你可以使它asycronous(你的代码)。我试过但没有成功。使用异步并等待关键字 – 2013-05-19 13:25:46