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

这里是我的模型 ;
enter image description here

解决方法 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 找到的解决办法,并向它传递水平你目前正处于。

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

posted @ 2016-06-04 21:56  xszjk  阅读(364)  评论(0)    收藏  举报