C# 阿伦蒂德) { 退货项目 .Where(x=>x.ParentId==ParentId) .选择(e=>新建菜单项 { Id=e.Id, Name=e.Name, ParentId=e.ParentId, Children=GetChildren(项目,例如Id) }).ToList(); }
剃须刀代码C# 阿伦蒂德) { 退货项目 .Where(x=>x.ParentId==ParentId) .选择(e=>新建菜单项 { Id=e.Id, Name=e.Name, ParentId=e.ParentId, Children=GetChildren(项目,例如Id) }).ToList(); },c#,asp.net-mvc-4,C#,Asp.net Mvc 4,剃须刀代码 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},
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<MenuDTO> mi = allMenu
.Select(e => new
{
Id = e.Id,
Name = e.Name,
ParentId = e.ParentId,
Children = allMenu.Where(x => x.ParentId == e.Id).ToList()
}).ToList()
.Select(p => new MenuDTO
{
Id = p.Id,
Name = p.Name,
ParentId = p.ParentId,
Children = p.Children
//Children = p.Children.Cast<MenuDTO>()
}).ToList();
ViewBag.menusList = mi;
return View();
}
@{
var menuList = ViewBag.menusList as List<Scaffolding.Controllers.MenuDTO>;
ShowTree(menuList);
}
@helper ShowTree(List<Scaffolding.Controllers.MenuDTO> menusList)
{
if (menusList != null)
{
foreach (var item in menusList)
{
<li>
<span>@item.Name</span>
@if (item.Children.Any())
{
<ul>
@ShowTree(item.Children)
</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 = GetChildren(allMenu, e.Id) /* Recursively grab the children */
}).ToList();
ViewBag.menusList = mi;
return View();
}
/// <summary>
/// Recursively grabs the children from the list of items for the provided parentId
/// </summary>
/// <param name="items">List of all items</param>
/// <param name="parentId">Id of parent item</param>
/// <returns>List of children of parentId</returns>
private static List<MenuItem> GetChildren(List<MenuItem> items, int parentId)
{
return items
.Where(x => x.ParentId == parentId)
.Select(e => new MenuItem
{
Id = e.Id,
Name = e.Name,
ParentId = e.ParentId,
Children = GetChildren(items, e.Id)
}).ToList();
}
@{
var menuList = ViewBag.menusList as List<Scaffolding.Controllers.MenuItem>;
@ShowTree(menuList);
}
@helper ShowTree(List<Scaffolding.Controllers.MenuItem> menusList)
{
if (menusList != null)
{
foreach (var item in menusList)
{
<li>
<span>@item.Name</span>
@if (item.Children.Any())
{
<ul>
@ShowTree(item.Children)
</ul>
}
</li>
}
}
}
@helper ShowTree(List<NestedChild.Controllers.MenuItem> menu, int? parentid = 0, int level = 0)
{
var items = menu.Where(m => m.ParentId == parentid);
if (items.Any())
{
if (items.First().ParentId > 0)
{
level++;
}
<ul>
@foreach (var item in items)
{
<li>
@item.Name
</li>
@ShowTree(menu, item.Id, level);
}
</ul>
}
}
@{
var menuList = ViewBag.menusList as List<NestedChild.Controllers.MenuItem>;
@ShowTree(menuList);
}
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();
}
@{
var menuList=ViewBag.menusList作为列表;
@ShowTree(menuList);
}
@助手ShowTree(列表菜单列表)
{
如果(菜单列表!=null)
{
foreach(菜单列表中的变量项)
{
@项目名称
@if(item.Children.Any())
{
@ShowTree(项.子项)
}
}
}
}
我用这种方式修复并完成了工作
问题出在razor代码的逻辑中,我也对这一行进行了注释/。其中(e=>e.ParentId==0)
我在这里添加了工作代码
工作代码示例
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<MenuDTO> mi = allMenu
.Select(e => new
{
Id = e.Id,
Name = e.Name,
ParentId = e.ParentId,
Children = allMenu.Where(x => x.ParentId == e.Id).ToList()
}).ToList()
.Select(p => new MenuDTO
{
Id = p.Id,
Name = p.Name,
ParentId = p.ParentId,
Children = p.Children
//Children = p.Children.Cast<MenuDTO>()
}).ToList();
ViewBag.menusList = mi;
return View();
}
@{
var menuList = ViewBag.menusList as List<Scaffolding.Controllers.MenuDTO>;
ShowTree(menuList);
}
@helper ShowTree(List<Scaffolding.Controllers.MenuDTO> menusList)
{
if (menusList != null)
{
foreach (var item in menusList)
{
<li>
<span>@item.Name</span>
@if (item.Children.Any())
{
<ul>
@ShowTree(item.Children)
</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 = GetChildren(allMenu, e.Id) /* Recursively grab the children */
}).ToList();
ViewBag.menusList = mi;
return View();
}
/// <summary>
/// Recursively grabs the children from the list of items for the provided parentId
/// </summary>
/// <param name="items">List of all items</param>
/// <param name="parentId">Id of parent item</param>
/// <returns>List of children of parentId</returns>
private static List<MenuItem> GetChildren(List<MenuItem> items, int parentId)
{
return items
.Where(x => x.ParentId == parentId)
.Select(e => new MenuItem
{
Id = e.Id,
Name = e.Name,
ParentId = e.ParentId,
Children = GetChildren(items, e.Id)
}).ToList();
}
@{
var menuList = ViewBag.menusList as List<Scaffolding.Controllers.MenuItem>;
@ShowTree(menuList);
}
@helper ShowTree(List<Scaffolding.Controllers.MenuItem> menusList)
{
if (menusList != null)
{
foreach (var item in menusList)
{
<li>
<span>@item.Name</span>
@if (item.Children.Any())
{
<ul>
@ShowTree(item.Children)
</ul>
}
</li>
}
}
}
@helper ShowTree(List<NestedChild.Controllers.MenuItem> menu, int? parentid = 0, int level = 0)
{
var items = menu.Where(m => m.ParentId == parentid);
if (items.Any())
{
if (items.First().ParentId > 0)
{
level++;
}
<ul>
@foreach (var item in items)
{
<li>
@item.Name
</li>
@ShowTree(menu, item.Id, level);
}
</ul>
}
}
@{
var menuList = ViewBag.menusList as List<NestedChild.Controllers.MenuItem>;
@ShowTree(menuList);
}
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();
}
@helper ShowTree(列表菜单,int?parentid=0,int level=0)
{
var items=menu.Where(m=>m.ParentId==ParentId);
if(items.Any())
{
if(items.First().ParentId>0)
{
级别++;
}
@foreach(项目中的var项目)
{
-
@项目名称
@ShowTree(菜单、项、Id、级别);
}
}
}
@{
var menuList=ViewBag.menusList作为列表;
@ShowTree(menuList);
}
公共行动结果索引()
{
列表所有菜单=新建列表
{
新菜单项{Id=1,Name=“Parent 1”,ParentId=0},
新菜单项{Id=2,Name=“child 1”,ParentId=1},
新菜单项{Id=3,Name=“child 2”,ParentId=1},
新菜单项{Id=4,Name=“child 3”,ParentId=1},
新菜单项{Id=5,Name=“Parent 2”,ParentId=0},
新菜单项{Id=6,Name=“child 4”,ParentId=4}
};
列表mi=allMenu
//.Where(e=>e.ParentId==0)/*仅获取根父节点*/
.选择(e=>新建菜单项
{
Id=e.Id,
Name=e.Name,
ParentId=e.ParentId,
//Children=allMenu.Where(x=>x.ParentId==e.Id).ToList()
}).ToList();
ViewBag.menusList=mi;
返回视图();
}
ShowTree需要一个列表,但您正在发送项目@ShowTree(item.Children)。如果将@ShowTree(item.Children)替换为@ShowTree(item),则会将列表传递给该方法;它应该是@ShowTree(menuList);然后调用ShowTree并在页面中写入数据。不管怎样,谢谢你的回答。接得好!对不起,我没有机会测试代码。我只是想让你知道算法可能遗漏了child 4。如果您知道将有三个级别的菜单项,那么您可以添加另一个级别的Where(…)。为当前Select
子句的Children
属性选择{…}.ToList()
子句以覆盖第三个菜单级别(Children 4所在的位置)。请查看上面的代码,告诉我如何更改其结果。应显示嵌套的子项。当我运行我的程序时,孩子4的名字并没有显示哪个是孩子3的孩子。代码中的问题是什么,如果您知道,请告诉我要修复什么。thanksI继续并在“完整工作代码”中修改了查询。我是个新手,所以我希望你不要介意。我终于意识到我缺少了你想要的递归查询部分,我已经把它添加到了我的解决方案中。请用新的更改测试并更新您的“完整工作代码”。看起来很棒!我更喜欢你的解决方案。如果列表来自数据库,那么我的代码会变慢,因为它会为每组子项进行更多的往返数据库。在得到结果后,您的代码将使用层次结构遍历进行一次查询,这应该会更快。仅供参考,您不再需要Children=allMenu.Where(x=>x.ParentId==e.Id).ToList()
行或Children
属性。这只会减慢代码的速度。是的,你是对的。我将评论这句话。谢谢你的帮助和支持。