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>
}
更新:输出看起来像这样 ;
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
这里是我的模型 ;
解决方法 1:
你可以使用 partialview,然后执行递归循环。为了做到这一点你会首先需要有点改变您的模型:
ViewModel
// 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;} }
控制器
变换成分层 ViewModel 模型:
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 标记,但您可以通过创建另一个 viewmodel 找到的解决办法,并向它传递水平你目前正处于。
注意: 键入了所有此代码在等-编辑器中,因此可能有一些小的语法错误。
 
                    
                
 
 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号