Asp.net-Mvc

ASP.NET MVC 4 生成帶有遞歸局部視圖的樹視圖

  • September 14, 2016

我在一個強類型的 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&lt;Category&gt; Categories { get; set; }
   }
}

控制器(注意:您通過將 Seed 屬性設置為 null 來啟動遞歸鏈,這將獲取所有 null 父級)

namespace trash.Controllers
{
   public class HomeController : Controller
   {
       public ActionResult Index()
       {
           IList&lt;trash.Models.Category&gt; categories = new List&lt;trash.Models.Category&gt;();
           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 =&gt; s.Parent_ID == Model.Seed).Any())
{
   &lt;ul&gt;
       @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 };
           &lt;li&gt;&lt;a href="?@node.ID"&gt;@node.Name&lt;/a&gt;
               @Html.Partial("_TreeCategories", inner)
           &lt;/li&gt;
           }
       }
   &lt;/ul&gt;
}

引用自:https://stackoverflow.com/questions/17553286