ASP.NET MVC 4 生成帶有遞歸局部視圖的樹視圖
我在一個強類型的 MVC 4 項目中有一個部分視圖。它需要一個數據庫表的 IEnumerable 集合。在該表中有 ID、名稱和 ParentID,用於儲存記錄之間的分層連接。呼叫分部視圖的視圖也是強類型的,它以整個數據庫為模型,將Categories表作為可列舉的集合傳遞給分部視圖:
@Html.Partial("_TreeCategories", @Model.Categories.ToList())而在局部視圖中,我想先取根節點,這樣我就可以用遞歸的方式擴展整棵樹。在數據庫表中,所有記錄都被視為具有 ParentID == null 的根節點。
所以一般來說,我這樣做的方式如下:
@model IEnumerable<TreeCollections.OpenAccess.Category> @if (Model.ToList().Count >= 0) { @if (Model.ToList()[0].Parent_id == null) { <text><ul id="navigation"></text> } @foreach (var node in @Model) { <li><a href="?@node.Id">@node.Name</a> @foreach (var subNode in @Model.Where(s => s.Parent_id == node.Id)) { @Html.Partial("_TreeCategories", subNode) } </li> } @if (Model.ToList()[0].Parent_id == null) { </ul> } }所以我檢查模型的第一個元素的ParentID是否為null,如果是,那麼它應該創建一個id為“navigation”的<ul>標籤,這樣jquery外掛就可以辨識出它是一個treeview控制項. 然後它創建一個帶有遞歸呼叫的列表標籤。遞歸呼叫的局部視圖將節點的子節點作為模型。最後,如果我們到達局部視圖渲染的末尾,並且我們處於“根級別”,它應該編寫一個結束 <ul> 標記
然而,也存在一些問題。首先,最後,關閉無序列表標籤是錯誤的,VS 找不到匹配的開始標籤。其次,我不知道為什麼,但是在頂部,我可以將starter <ul>標籤放在標籤之間,而我不能在下面的結束標籤處這樣做。但是我也不確定這些 < ul > 標籤,我也覺得那些是錯誤的。
請幫助我,我已經堅持了好幾天了。
伙計,你有一些奇怪的事情發生在這裡。我感覺到你被卡住的痛苦。
看看這是否能讓你的船浮起來。
當您在同一個列表上進行遞歸時,您需要一個種子值來跟踪您在列表中查找的內容。最好在課堂上做一個父子映射,但是考慮到你的結構,這樣做很有趣,應該可以解決問題。
楷模
namespace trash.Models { public class Category { public int ID { get; set; } public int? Parent_ID { get; set; } public string Name {get; set;} } public class SeededCategories { public int? Seed { get; set; } public IList<Category> Categories { get; set; } } }控制器(注意:您通過將 Seed 屬性設置為 null 來啟動遞歸鏈,這將獲取所有 null 父級)
namespace trash.Controllers { public class HomeController : Controller { public ActionResult Index() { IList<trash.Models.Category> categories = new List<trash.Models.Category>(); categories.Add(new trash.Models.Category { ID = 1, Parent_ID = null, Name = "Top1" }); categories.Add(new trash.Models.Category { ID = 2, Parent_ID = null, Name = "Top2" }); categories.Add(new trash.Models.Category { ID = 3, Parent_ID = 1, Name = "Top1Ring1" }); categories.Add(new trash.Models.Category { ID = 4, Parent_ID = 1, Name = "Top1Ring2" }); trash.Models.SeededCategories model = new Models.SeededCategories { Seed = null, Categories = categories }; return View(model); } } }瀏覽指數
@model trash.Models.SeededCategories Here's a list @Html.Partial("_TreeCategories", Model)部分(您的 _TreeCategories。注意:將種子設置為目前節點 ID 和 volia 遞歸)
@model trash.Models.SeededCategories @if (Model.Categories.Where(s => s.Parent_ID == Model.Seed).Any()) { <ul> @foreach (var node in Model.Categories) { if (node.Parent_ID == Model.Seed) { trash.Models.SeededCategories inner = new trash.Models.SeededCategories { Seed = node.ID, Categories = Model.Categories }; <li><a href="?@node.ID">@node.Name</a> @Html.Partial("_TreeCategories", inner) </li> } } </ul> }