【发布时间】:2018-03-22 15:24:34
【问题描述】:
我正在尝试在 ul/li 中显示嵌套数据,但未显示嵌套子项。查看我的代码,请告诉我那里有什么问题。
控制器:
public ActionResult Index()
{
List<MenuItem> allMenu = new List<MenuItem>
{
new MenuItem {Id=1,Name="Parent 1", ParentId=0},
new MenuItem {Id=2,Name="child 1", ParentId=1},
new MenuItem {Id=3,Name="child 2", ParentId=1},
new MenuItem {Id=4,Name="child 3", ParentId=1},
new MenuItem {Id=5,Name="Parent 2", ParentId=0},
new MenuItem {Id=6,Name="child 4", ParentId=4}
};
List<MenuItem> mi = allMenu
.Where(e => e.ParentId == 0) /* grab only the root parent nodes */
.Select(e => new MenuItem
{
Id = e.Id,
Name = e.Name,
ParentId = e.ParentId,
Children = allMenu.Where(x => x.ParentId == e.Id).ToList()
}).ToList();
ViewBag.menusList = mi;
return View();
}
POCO 类:
public class MenuItem
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public virtual List<MenuItem> Children { get; set; }
}
查看:
@helper ShowTree(List<Scaffolding.Controllers.MenuItem> menusList)
{
<ul>
@foreach (var item in menusList)
{
<li>
<span>@item.Name</span>
@if (item.Children != null && item.Children.Any())
{
@ShowTree(item.Children)
}
</li>
}
</ul>
}
@{
var menuList = ViewBag.menusList as List<Scaffolding.Controllers.MenuItem>;
@ShowTree(menuList);
}
如果您运行代码,您将看到孩子 4 没有显示哪个是孩子 3 的孩子。请告知我需要在代码中更改的内容。谢谢
【问题讨论】:
-
如果
"child 4"是"child 3"的孩子,但"child 3"本身就是孩子(因此ParentId不为零,那么.Where(e => e.ParentId == 0)这一行将过滤掉它并它永远不会像您需要的那样填充其Children属性。 -
此外,即使您删除了 where 子句,您仍然会遇到问题,即您需要对其进行多次传递才能使 MenuItems 像您需要的那样递归嵌套。
-
@Shelby115 你能纠正我的代码,这将适用于第 n 次嵌套,因为没有什么比在哪里更改代码更能想到的了。谢谢
标签: asp.net-mvc