在Asp.Net MVC中循环通过多级动态菜单

我试图循环多级动态菜单。 我已经成功地手动执行此操作,即每次如果要显示子项Menus的父项,我必须手动循环。 我想知道通过这些动态菜单循环多级的最佳方式或替代方法这是我到目前为止所做的事情;

 @{ var menusList = ViewBag.Menus as IEnumerable; } @foreach (var parentMenu in menusList.Where(p => p.ParentId == 0)) { 
  • @parentMenu.Name

    @if (menusList.Count(p => p.ParentId == parentMenu.MenuId) > 0) {
      @foreach (var childMenu in menusList.Where(p => p.ParentId == parentMenu.MenuId)) {

      @childMenu.Name

      if (menusList.Count(p => p.ParentId == childMenu.MenuId) > 0) { foreach (var subChild in menusList.Where(p => p.ParentId == childMenu.MenuId)) {

      @subChild.Name

      } } }
    }
}

更新:输出看起来像这样;

 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 

这是我的模特;
在此处输入图像描述

您可以使用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 Children {get; set;} } 

调节器

将模型转换为分层ViewModel:

 public ActionResult Menus(){ List menusource; // get your menus here ViewBag.Menus = CreateVM(0, menusource); // transform it into the ViewModel return View(); } public IEnumerable CreateVM(int parentid, List 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; Html.RenderPartial("MenuPartial", menuslist); } 

MenuPartial

 @model IEnumerable @foreach (var menuitem in model) { 
  • @menuitem.Name

    @{ Html.RenderPartial("MenuPartial", menuitem.Children); }
}

关于原始代码,你唯一缺少的就是你没有不同的Hx标签,但你可以通过创建另一个viewmodel并将其传递给你当前所在的级别来找到解决方法。

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