2

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

@{ 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

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

4

1 回答 1

7

您可以使用局部视图,然后执行递归循环。为此,您首先需要稍微更改一下模型:

视图模型

// 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);
}

菜单部分

@model IEnumerable<MenuViewModel>

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

关于原始代码,您在这里唯一会丢失的是您没有不同的 Hx 标记,但是您可以通过创建另一个视图模型并将其传递到您当前所在的级别来找到解决方法。

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

于 2013-05-12T09:04:12.017 回答