ASP.NetMVC:如何使用递归技术展示嵌套父子关系我只是尝试使用递归函数调用在razor和li中使用ul来显示第n个关系。假设我有一个数据库表,我在其中存储父子关系,如下所示。表结构+----+------------+--------+|编号|名称|家长编号|+----+-----------+----------+|1|父母1|0|+----+----------+----------+|2|孩子1|1|+----+----------+----------+|3|孩子2|1|+----+----------+----------+|4|孩子3|1|+----+------------+--------+|5|家长|0|+----+----------+----------+|6|孩子4|4|+----+----------+------------+所以我想在剃刀视图中以这种方式显示嵌套数据Parent1child1child2child3child4Parent所以我尝试了这段代码但无法实现目标。c#POCO课程publicclassMenuItem{publicintId{get;放;}公共字符串名称{得到;放;}publicintParentId{得到;放;}publicvirtualICollectionChildren{get;放;}}publicclassMenuDTO{publicintId{get;放;}公共字符串名称{得到;放;}publicintParentId{得到;放;}publicvirtualICollectionChildren{get;放;}}行代码publicActionResultIndex(){ListallMenu=newList{newMenuItem{Id=1,Name="Parent1",ParentId=0},newMenuItem{Id=2,Name="child1",ParentId=1},新菜单项{Id=3,Name="child2",ParentId=1},新菜单项{Id=4,Name="child3",ParentId=1},新菜单项{Id=5,Name="父母2",ParentId=0},新菜单项{Id=6,Name="孩子4",ParentId=4}};列表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=>newMenuDTO{Id=p.Id,Name=p.Name,ParentId=p.ParentId,Children=p.Children//Children=p.Children.Cast()}).ToList();ViewBag.menusList=mi;返回视图();}Razor代码@{varmenuList=ViewBag.menusListasList;显示树(菜单列表);}@helperShowTree(ListmenusList){if(menusList!=null){foreach(variteminmenusList){@item.Name@if(item.Children.Any()){}}}}在我的案例中当我运行我的代码时,我正在查询列表allMenu以从数据库表中获取数据然后我得到以下错误CS1502:'ASP._Page_Views_Menu_Index_cshtml.ShowTree(System.Collections.Generic.List)'方法匹配有一些无效参数告诉我有什么问题我的代码。请帮助我修复并实现我的目标。谢谢编辑完整的工作代码如下@helperShowTree(ListmenusList){}@{varmenuList=ViewBag.menusListasList;@ShowTree(菜单列表);}publicActionResultIndex(){ListallMenu=newList{newMenuItem{Id=1,Name="Parent1",ParentId=0},newMenuItem{Id=2,Name="child1",ParentId=1},新菜单项{Id=3,Name="child2",ParentId=1},新菜单项{Id=4,Name="child3",ParentId=1},新菜单项{Id=5,Name="Parent2",ParentId=0},newMenuItem{Id=6,Name="child4",ParentId=4}};Listmi=allMenu.Where(e=>e.ParentId==0)/*只抓取根父节点*/.Select(e=>newMenuItem{Id=e.Id,Name=e.Name,ParentId=e.ParentId,Children=allMenu.Where(x=>x.ParentId==e.Id)/*抓取二级孩子*/.Select(e2=>newMenuItem{Id=e2.Id,Name=e2.Name,ParentId=e2.ParentId,Children=allMenu.Where(x2=>x2.ParentId==e2.Id).ToList()/*抓三级孩子*/}).ToList()}).ToList();ViewBag.menusList=mi;关于转视图();}publicclassMenuItem{publicintId{get;放;}公共字符串名称{得到;放;}publicintParentId{得到;放;}publicvirtualListChildren{get;放;您的代码在执行@ShowTree(item.Children)行时找不到采用ICollection类型参数的函数ShowTree,因为item.Children是ICollection代码中的函数ShowTree采用不同类型List的参数,这与ICollection不同。所以运行时报告您看到的CS1502错误。在意识到您正在寻找递归解决方案之后,我修改了代码来做到这一点。行动守则publicActionResultIndex(){ListallMenu=newList{newMenuItem{Id=1,Name="Parent1",ParentId=0},newMenuItem{Id=2,Name="child1",ParentId=1},新菜单项{Id=3,Name="child2",ParentId=1},新菜单项{Id=4,Name="child3",ParentId=1},新菜单项{Id=5,Name="Parent2",ParentId=0},newMenuItem{Id=6,Name="child4",ParentId=4}};Listmi=allMenu.Where(e=>e.ParentId==0)/*只抓取根父节点*/.Select(e=>newMenuItem{Id=e.Id,Name=e.Name,ParentId=e.ParentId,Children=GetChildren(allMenu,e.Id)/*递归抓取孩子*/}).ToList();ViewBag.menusList=mi;返回视图();}//////递归地从提供的parentId的项目列表中获取子项目//////所有项目的列表///父项目的ID///parentId的子项目列表privatestaticListGetChildren(列表项,intparentId){returnitems.Where(x=>x.ParentId==parentId).Select(e=>newMenuItem{Id=e.Id,Name=e.Name,ParentId=e.ParentId,Children=GetChildren(items,e.Id)}).ToList();}Razor代码@{varmenuList=ViewBag.menusListasList;@ShowTree(菜单列表);}@helperShowTree(ListmenusList){if(menusList!=null){foreach(variteminmenusList){@item.Name@if(item.Children.Any()){}}}}我修复了它并做了以这种方式工作问题是剃刀代码的逻辑,我也评论这一行//.Where(e=>e.ParentId==0)在这里我添加工作代码工作代码示例以上是C#学习教程:ASP.NetMVC:Howtouserecursivetechnologytodisplaythenestedparent-childrelationship分享所有内容,如果对你有用还需要进一步了解C#学习教程,希望大家多多关注—@helperShowTree(Listmenu,int?parentid=0,intlevel=0){varitems=menu.Where(m=>m.ParentId==parentid);if(items.Any()){if(items.First().ParentId>0){level++;}}}@{varmenuList=ViewBag.menusListasList;@ShowTree(菜单列表);}publicActionResultIndex(){ListallMenu=newList{newMenuItem{Id=1,Name="Parent1",ParentId=0},newMenuItem{Id=2,Name="child1",ParentId=1},新菜单项{Id=3,Name="child2",ParentId=1},新菜单项{Id=4,Name="child3",ParentId=1},新菜单项{Id=5,Name="Parent2",ParentId=0},newMenuItem{Id=6,Name="child4",ParentId=4}};Listmi=allMenu//.Where(e=>e.ParentId==0)/*只抓取根父节点*/.Select(e=>newMenuItem{Id=e.Id,Name=e.Name,ParentId=e.ParentId,//Children=allMenu.Where(x=>x.ParentId==e.Id).ToList()}).ToList();ViewBag.menusList=米;返回视图();}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如有转载请注明出处:
