簡體   English   中英

在Asp.Net MVC中循環瀏覽多級動態菜單

[英]Loop Through Multi-Level Dynamic Menus in Asp.Net MVC

我試圖遍歷多級動態菜單。 我已經成功地手動執行了此操作,即,每次要顯示其父級的子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

這是我的模特;
在此處輸入圖片說明

您可以使用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;}
}

調節器

將模型轉換為分層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標簽,但是您可以通過創建另一個視圖模型並將其傳遞到當前級別來找到解決方法。

注意:我在SO編輯器中鍵入了所有這些代碼,因此可能會有一些小的語法錯誤。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM