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 в вашем представлении).