ASP.NET MVC中的分层数据

时间:2020-03-05 18:51:59  来源:igfitidea点击:

我正在尝试提出使用ASP.NET MVC将某些层次结构数据呈现到嵌套无序列表中的最佳方法。有人对如何执行此操作有任何提示吗?

解决方案

回答

意思是...我们想要某种树状视图?

实际上,我们可以使treeview控件正常工作...但是我们必须将其包装在服务器端form标记中才能起作用。我们将获得通常带来的麻烦(例如生成的ID和ViewState),但从渲染角度来看,它将起作用。

如果我们只想创建标签并嵌套它们,那么使用foreach()循环将非常容易。

回答

我建议使用jquery树视图插件来使其像树一样起作用,但是对于渲染,只需将其放在递归的lambda帮助器中进行嵌套即可。

回答

为此,我使用递归调用自定义组件(在新的Preview5中为ascx或者aspx)。
我给组件提供了第一级项目(项目列表),然后组件检查列表中的每个项目是否存在任何子项目,并用该子项目的列表进行调用。
我们可以在控制器中构建对象的层次图,也可以仅构建具有ParentID属性的一维列表。

回答

我相信当前没有这样的控件。...TreeViews本质上是复杂的。当然,我们可以使用各种中继器和循环来"绘制"层次结构,但是要实现树形视图的功能(如Web窗体工具箱中的视图),我们必须等待!

回答

我们为什么不以树的形式将模型传递给视图?

/// 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帮助器以渲染树。