c# - 如何在扩展 Kendo Treeview 上加载子节点

标签 c# jquery asp.net-mvc kendo-treeview

我想创建一个 treeviewnodes来自我电脑上的文件夹和文件。用户可以dragdrop nodes .

我的设计 View (cshtml):

@(
    Html.Kendo().TreeView()
        .Name("treeview")
        .Events(ev=>ev.Expand("onExpand"))
        .BindTo((IEnumerable<TreeViewItemModel>)ViewBag.ParentNode)
)

我的 Controller :
public class HomeController : Controller
{
    public ActionResult TreeView()
    {
        ViewBag.ParentNode = GetDefaultNode();
        return View();
    }
    private IEnumerable<TreeViewItemModel> GetDefaultNode()
    {
        List<TreeViewItemModel> defaultNode = new List<TreeViewItemModel>();
        string[] drivers = Directory.GetLogicalDrives();
        for (int i = 0; i < drivers.Length; i++)
        {
                TreeViewItemModel node = new TreeViewItemModel();
                node.Text = drivers[i];
                node.Url = drivers[i];
                defaultNode.Add(node);
                GetChildNode(node);
        }

        return defaultNode;
    }
    private void GetChildNode(TreeViewItemModel item)
    {
        if (Directory.Exists(item.Text))
        {
            try
            {
                string[] dirNodes = Directory.GetDirectories(item.Text);
                if (dirNodes.Length > 0)
                {
                    for (int i = 0; i < dirNodes.Length; i++)
                    {
                        TreeViewItemModel child = new TreeViewItemModel();
                        DirectoryInfo dirInfo = new DirectoryInfo(dirNodes[i]);
                        child.Text = dirInfo.Name;
                        child.Url = dirInfo.FullName;
                        child.HasChildren = true;
                        item.Items.Add(child);
                        child.Items.Add(new TreeViewItemModel());
                    }
                }
                string[] fileNodes = Directory.GetFiles(item.Text);
                if (fileNodes.Length > 0)
                {
                    for (int f = 0; f < fileNodes.Length; f++)
                    {
                        TreeViewItemModel child = new TreeViewItemModel();
                        FileInfo fileInfo = new FileInfo(fileNodes[f]);
                        child.Text = fileInfo.Name;
                        child.Url = fileInfo.FullName;
                        child.HasChildren = true;
                        item.Items.Add(child);
                    }
                }

            }
            catch { }

        }
    }
}

它显示根 node和根的 child node .

我希望在用户扩展根目录 node 上加载子节点.所以我声明事件onExpandtreeview ,但我不知道如何将当前展开节点传递给 Controller ​​,并获取 nodes 的列表在 View 中,之后将其插入到当前展开节点。
我在这个页面和谷歌上搜索了很多,但找不到解决我问题的方法。

ps:对不起,我的英文不好,希望你能理解我的意思。

更新:

我改为使用绑定(bind)到远程日期,但我仍然没有解决我的问题。

我的cshtml:
    @(Html.Kendo().TreeView()
.Name("treeview")
.DataTextField("Text")
.DataUrlField("Url")
.DataSource(dataSource => dataSource
    .Read(read => read
        .Action("GetRoot", "Home")
    )
)
)

我的 Controller :
        public JsonResult GetRoot()
    {
        return Json(GetDefaultNode(), JsonRequestBehavior.AllowGet);
    }
    private IEnumerable<TreeViewItemModel> GetDefaultNode()
    {
        List<TreeViewItemModel> defaultNode = new List<TreeViewItemModel>();
        string[] drivers = Directory.GetLogicalDrives();
        for (int i = 0; i < drivers.Length; i++)
        {
                TreeViewItemModel node = new TreeViewItemModel();
                node.Text = drivers[i];
                node.Url = drivers[i];
                defaultNode.Add(node);
                GetChildNode(node);
        }

        return defaultNode;
    }
    private void GetChildNode(TreeViewItemModel item)
    {
        if (Directory.Exists(item.Text))
        {
            try
            {
                string[] dirNodes = Directory.GetDirectories(item.Text);
                if (dirNodes.Length > 0)
                {
                    for (int i = 0; i < dirNodes.Length; i++)
                    {
                        TreeViewItemModel child = new TreeViewItemModel();
                        DirectoryInfo dirInfo = new DirectoryInfo(dirNodes[i]);
                        child.Text = dirInfo.Name;
                        child.Url = dirInfo.FullName;
                        item.Items.Add(child);
                    }
                }
                string[] fileNodes = Directory.GetFiles(item.Text);
                if (fileNodes.Length > 0)
                {
                    for (int f = 0; f < fileNodes.Length; f++)
                    {
                        TreeViewItemModel child = new TreeViewItemModel();
                        FileInfo fileInfo = new FileInfo(fileNodes[f]);
                        child.Text = fileInfo.Name;
                        child.Url = fileInfo.FullName;
                        item.Items.Add(child);
                    }
                }

            }
            catch { }

        }
    }

这是结果:

enter image description here

如您所见,它只显示 root nodes没有 child nodes .当我调试时,根节点包含子节点

enter image description here

最佳答案

问题解决了。使用远程数据绑定(bind)时,节点仅加载在同一级别。当 onExpand 触发时,它会再次调用方法 GetNodes。

 public JsonResult GetNodes(string id)
    {
        List<Node> node = new List<Node>();
        List<string> drivers=new List<string>();
        if (string.IsNullOrEmpty(id))
        {
            drivers.AddRange(Directory.GetLogicalDrives());
        }
        else
        {
            if(Directory.Exists(id))
                drivers.AddRange(Directory.GetDirectories(id));
        }

            try
            {
                for (int i = 0; i < drivers.Count; i++)
                {
                    Node item = new Node();
                    DirectoryInfo dirInfo = new DirectoryInfo(drivers[i]);
                    item.id = dirInfo.FullName;
                    item.Name = dirInfo.Name;
                    item.hasChildren = HasNodes(drivers[i]);
                    node.Add(item);
                }
            }
            catch { }

        return Json(node, JsonRequestBehavior.AllowGet);
    }

关于c# - 如何在扩展 Kendo Treeview 上加载子节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26861498/

相关文章:

asp.net-mvc - 如何从 ASP.NET MVC 应用程序返回 404 响应?

c# - 如何删除选定的 DataGridViewRow 并更新连接的数据库表?

javascript - jQuery DOM 就绪和 JavaScript 执行

javascript - HTML根据id显示隐藏<tr>(递增)

javascript - 如何停止允许或阻止减号多次输入文本框?

asp.net-mvc - MVC 4 Bundles Scripts.Render 每个文件的脚本标签

c# - Interop.word 在前台打开文档

c# - 类不包含采用 0 个参数的构造函数

c# - 为什么我在使用 AnyIn 时收到错误 "The serializer for field ... must implement IBsonArraySerializer"?

jquery - 将带有链接的按钮分组