Я пытаюсь найти лучший способ отобразить некоторые иерархические данные во вложенном неупорядоченном списке с помощью ASP.NET MVC. Есть ли у кого-нибудь советы, как это сделать?





Вы имеете в виду ... вам нужно какое-то древовидное представление?
На самом деле вы можете заставить работать древовидный элемент управления ... но вы должны обернуть его тегом формы на стороне сервера для работы. Вы получите обычную неприятность, которую это приносит (например, сгенерированные идентификаторы и состояние просмотра), но это будет работать с точки зрения рендеринга.
Если вы хотите просто создавать теги и вкладывать их, это будет довольно просто сделать с помощью циклов foreach ().
Я предлагаю плагины jquery tree view, чтобы заставить его функционировать как дерево, но что касается рендеринга, просто поместите его в рекурсивный помощник лямбда для выполнения вложенности.
Для этого (рендеринг иерархического меню, древовидного представления и т. д.) Я использую рекурсивные вызовы пользовательского компонента (ascx или aspx в новом превью5) .
Я даю компоненту первый уровень элементов (список элементов), а затем компонент проверяет каждый элемент в списке, есть ли какие-либо дочерние элементы, и вызываю себя со списком этих дочерних элементов.
Вы можете построить иерархический граф объектов в контроллере или просто одномерный список со свойством ParentID.
Я считаю, что в настоящее время такого контроля нет ... TreeView по своей природе сложны. Конечно, вы можете сколько угодно «рисовать» иерархию, используя всевозможные повторители и циклы, но чтобы получить функциональность древовидного представления, такого как в наборе инструментов веб-форм ... вам нужно подождать!
Почему бы вам не передать вашу модель в виде дерева в представление?
/// This is the model class
public class MyTreeNode<T>
{
public ICollection<MyTreeNode> ChildNodes {get;}
public T MyValue { get; set; }
bool HasChildren { get { return ChildNodes.Any(); } }
}
///This is the html helper:
public static string RenderTree<T>(this HtmlHelper html, MyTreeNode<T> root, Func<T, string> renderNode)
{
var sb = new StringBuilder();
sb.Append(renderNode(root.MyValue));
if (root.HasChildren)
{
foreach(var child in root.ChildNodes)
{
sb.Append(RenderTree<T>(html, child, renderNode));
}
}
return sb.ToString();
}
На самом деле я не тестировал этот код, но он об идее. Вы можете представить себе создание своего собственного рекурсивного помощника HTML для визуализации дерева.
Хорошо, вам нужно добавить некоторый пользовательский элемент управления, который выполняет рендеринг при интеграции с плагином jquery treeview для максимальных функций ... Все еще нужно некоторое улучшение форматирования узла ... например, если он должен отображаться как ссылка ... спасибо
jquery для treecontrol звучит как хорошая идея, спасибо за предложение. Не могли бы вы подробнее рассказать, как использовать рекурсивную лямбду для рендеринга.