我在一个强类型的 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 > 标签,我也觉得那些是错误的。
请帮助我,我已经坚持了好几天了。