да ты прав. я прокомментирую эти строки. спасибо за вашу помощь и поддержку.
сто пытаюсь отобразить n-е отношение, используяul
а такжеli
в бритве с использованием рекурсивного вызова функции. Предположим, у меня есть таблица БД, в которой я храню отношения родитель-потомок, как показано ниже.
+----+----------+----------+
| ID | Name | ParentID |
+----+----------+----------+
| 1 | Parent 1 | 0 |
+----+----------+----------+
| 2 | child 1 | 1 |
+----+----------+----------+
| 3 | child 2 | 1 |
+----+----------+----------+
| 4 | child 3 | 1 |
+----+----------+----------+
| 5 | Parent | 0 |
+----+----------+----------+
| 6 | child 4 | 4 |
+----+----------+----------+
Так что мне нравится показывать вложенные данные таким образом в режиме бритвы
Parent 1
child 1
child 2
child 3
child 4
Parent
Так что этот код я пробовал, но не смог достичь цели.
c # POCO классы
public class MenuItem
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public virtual ICollection<MenuItem> Children { get; set; }
}
public class MenuDTO
{
public int Id { get; set; }
public string Name { get; set; }
public int ParentId { get; set; }
public virtual ICollection<MenuItem> Children { get; set; }
}
Код действия
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>
}
}
}
В моем случае я запросить список allMenu, чтобы получить данные из таблицы БД. когда я запускаю свой код, то я получаю ошибку ниже
CS1502: лучшее совпадение перегруженного метода для 'ASP._Page_Views_Menu_Index_cshtml.ShowTree (System.Collections.Generic.List)' имеет несколько недопустимых аргументов
скажи мне, что не так в моем коде. пожалуйста, помогите мне исправить и приобрести мою цель. Спасибо
РЕДАКТИРОВАТЬПолный рабочий код, как показано ниже
@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);
}
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) /* grab second level children */
.Select(e2 => new MenuItem
{
Id = e2.Id,
Name = e2.Name,
ParentId = e2.ParentId,
Children = allMenu.Where(x2 => x2.ParentId == e2.Id).ToList() /* grab third level children */
}).ToList()
}).ToList();
ViewBag.menusList = mi;
return View();
}
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; }
}