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
    属性。这只会减慢代码的速度。是的,你是对的。我将评论这句话。谢谢你的帮助和支持。