ASP.NET MVC 4 генерирует treeview с рекурсивным частичным представлением
у меня есть частичное представление в проекте MVC 4, который строго типизирован. Он принимает коллекцию IEnumerable таблицы базы данных. В этой таблице есть идентификаторы, имена и ParentIDs для хранения иерархические связи между записями. Представление, вызывающее частичное представление, также строго типизировано, оно принимает всю базу данных в качестве модели и передает таблицу категорий частичному представлению в виде перечисляемой коллекции:
@Html.Partial("_TreeCategories", @Model.Categories.ToList())
и в частичном представлении я хочу взять сначала корневые узлы, поэтому я могу расширить все дерево рекурсивным способом. В таблице базы данных все записи рассматриваются как корневые узлы с параметром ParentID == null.
Так что в общем, мой способ сделать это будет выглядеть так:
@model IEnumerable<TreeCollections.OpenAccess.Category>
@if (Model.ToList().Count >= 0)
{
@if (Model.ToList()[0].Parent_id == null)
{
<text><ul id="navigation"></text>
}
@foreach (var node in @Model)
{
<li><a href="?@node.Id">@node.Name</a>
@foreach (var subNode in @Model.Where(s => s.Parent_id == node.Id))
{
@Html.Partial("_TreeCategories", subNode)
}
</li>
}
@if (Model.ToList()[0].Parent_id == null)
{
</ul>
}
}
поэтому я проверяю, является ли ParentID первого элемента модели нулевым, и если это так, то он должен создать тег с идентификатором "навигация", чтобы плагин jquery мог распознать, что он предназначен для управления treeview. Затем он создает тег list с рекурсивный вызов внутри. Рекурсивно называемое частичное представление принимает дочерние элементы узла в качестве модели. И, наконец, если мы пришли к концу рендеринга частичного представления, и мы находимся на "корневом уровне", он должен написать закрывающий тег
Однако есть некоторые проблемы. Во-первых, в конце концов, этот закрывающий неупорядоченный тег списка неправильный, VS не может найти соответствующий начальный тег для этого. Во-вторых, я не знаю почему, но наверху я могу поместить тег starter между тегами, и я не могу этого сделать это на закрывающем теге ниже. Но я не уверен в этих тегах , я чувствую, что это тоже неправильно.
Пожалуйста, помоги мне, я застряла с этим на несколько дней.
2 ответов
чувак, у тебя тут что-то не так. я чувствую твою боль, когда ты застреваешь.
посмотреть, если это плывет лодка.
вам нужно начальное значение, чтобы отслеживать, что вы ищете в списке, когда вы делаете рекурсии в одном списке. лучше сделать родительское отображение детей в классе, но meh это было весело делать с учетом вашей структуры и должно сделать трюк.
модели
namespace trash.Models
{
public class Category
{
public int ID { get; set; }
public int? Parent_ID { get; set; }
public string Name {get; set;}
}
public class SeededCategories
{
public int? Seed { get; set; }
public IList<Category> Categories { get; set; }
}
}
Controller (Примечание: Вы начинаете цепочку рекурсии установка свойства Seed в null, которое будет забрать все нулевые родители)
namespace trash.Controllers
{
public class HomeController : Controller
{
public ActionResult Index()
{
IList<trash.Models.Category> categories = new List<trash.Models.Category>();
categories.Add(new trash.Models.Category { ID = 1, Parent_ID = null, Name = "Top1" });
categories.Add(new trash.Models.Category { ID = 2, Parent_ID = null, Name = "Top2" });
categories.Add(new trash.Models.Category { ID = 3, Parent_ID = 1, Name = "Top1Ring1" });
categories.Add(new trash.Models.Category { ID = 4, Parent_ID = 1, Name = "Top1Ring2" });
trash.Models.SeededCategories model = new Models.SeededCategories { Seed = null, Categories = categories };
return View(model);
}
}
}
вид Индекс
@model trash.Models.SeededCategories
Here's a list
@Html.Partial("_TreeCategories", Model)
Partial (ваши _TreeCategories. Примечание: установите Seed на текущий ID узла и рекурсию volia)
@model trash.Models.SeededCategories
@if (Model.Categories.Where(s => s.Parent_ID == Model.Seed).Any())
{
<ul>
@foreach (var node in Model.Categories)
{
if (node.Parent_ID == Model.Seed)
{
trash.Models.SeededCategories inner = new trash.Models.SeededCategories { Seed = node.ID, Categories = Model.Categories };
<li><a href="?@node.ID">@node.Name</a>
@Html.Partial("_TreeCategories", inner)
</li>
}
}
</ul>
}
вы можете попробовать рекурсивный TreeView для ASP.NET MVC.
Он позволяет указать все элементы TreeView с помощью объекта RecursiveDataSource, который можно настроить для извлечения данных для элемента дерева из удаленной конечной точки или локального источника "лениво", когда элемент расширяется.
RecursiveDataSource-это оболочка вокруг виджета JavaScript DS, которая вводит необходимость в некотором JS-коде, а также обновление кода сервера это обеспечит данные (либо реализацию веб-службы, либо размещение данных в переменной JS в вашем представлении).