【问题标题】:kendo ui treeview data from MVC controller来自 MVC 控制器的 kendo ui 树视图数据
【发布时间】:2015-11-16 12:02:51
【问题描述】:

我有一个存储过程,它使用 EF 从 SQL 数据库返回分层数据。 树视图仅显示父节点,不显示子节点。我一直在研究这个问题一段时间,但没有任何结果,这令人沮丧。感谢您在此问题上提供的任何帮助。

ParentId  Id         Title                         Level
--------- ---------- ----------------------------- ------
NULL      1          Chief Executive Officer       0
1         273        Vice President of Sales       1
273       16         Marketing Manager             2
273       274        North American Sales Manager  2
273       285        Pacific Sales Manager         2
16        23         Marketing Specialist          3
274       275        Sales Representative          3
274       276        Sales Representative          3
285       286        Sales Representative          3

在服务层,我有一个编排器类,它返回上面的表格。

public IEnumerable<TreeviewItem> GetBusinessStructure()
{
    return Context.ExecuteStoreQuery<TreeviewItem>("spGetEmployees");
}

模型类

public class TreeviewItem
{
    public int Id { get; set; }

    public string Name { get; set; }

    public int? ParentId { get; set; }
    public virtual TreeviewItem Parent { get; set; }

    public virtual ICollection<TreeviewItem> Children { get; set; }
}

控制器

public JsonResult BusinessStructure(int? id)
    {
        var model = from e in        BusinessStructureOrchestrator.GetBusinessStructures()
                    where (id.HasValue ? e.ParentId == id : e.ParentId == null)
                    select new
                    {
                        id = e.Id,
                        Name = e.Name,
                        hasChildren = e.Children.Any()
                    };

        return Json(model, JsonRequestBehavior.AllowGet);
    }

景色

@model FilterBusinessStructureViewModel
<div class="form-group">

<label for="" class="col-sm-12 control-label">Choose Divisions/BUs/Sites</label>

<div class="col-sm-12">
    @(Html.Kendo().TreeView()
            .Name("tvBusinessStructure")
            .DataTextField("Name")
            .Checkboxes(checkedboxes => checkedboxes
                .Name("SelectedDivision")
                .CheckChildren(true)
            )
            .DataSource(dataSource => dataSource
                .Model(m => m
                    .Id("Id")
                    .HasChildren("hasChildren")
                    .Children("Children"))
                    .Read(read => read
                                .Action("BusinessStructure", "Report")
                    )
            )
        )
</div>

【问题讨论】:

    标签: entity-framework model-view-controller kendo-ui hierarchy


    【解决方案1】:

    在四处寻找和反复试验后,我找到了一段代码并对其进行了修改。用来遍历层次结构的类是这样的

    public static class Treeview
    {
        public static IList<TreeviewItem> BuildTree(this IEnumerable<TreeviewItem> source)
        {
            var groups = source.GroupBy(i => i.ParentId);
    
            var roots = groups.FirstOrDefault(g => g.Key.HasValue == false).ToList();
    
            if (roots.Count > 0)
            {
                var dict = groups.Where(g => g.Key.HasValue).ToDictionary(g => g.Key.Value, g => g.ToList());
                for (int i = 0; i < roots.Count; i++)
                    AddChildren(roots[i], dict);
            }
    
            return roots;
        }
    
        private static void AddChildren(TreeviewItem node, IDictionary<int, List<TreeviewItem>> source)
        {
            if (source.ContainsKey(node.Id))
            {
                node.Children = source[node.Id];
                for (int i = 0; i < node.Children.Count; i++)
                    AddChildren(node.Children[i], source);
            }
            else
            {
                node.Children = new List<TreeviewItem>();
            }
        }
    
    }
    

    然后我对控制器方法做了如下改动

    public JsonResult BusinessStructure(int? id)
        {
    
            List<BusinessStructureModel> businessStructures = BusinessStructureOrchestrator.GetBusinessStructures()
            .Select(e => new BusinessStructureModel
            {
                Id = e.ID,
                Name = e.Name,
                ParentId = e.ParentID
            })
            .BuildTree()
            .ToList();
    
            return Json(businessStructures, JsonRequestBehavior.AllowGet);
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-09
      • 1970-01-01
      • 1970-01-01
      • 2013-02-17
      • 1970-01-01
      • 2016-05-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多