带有新数据源的kendo树视图

时间:2013-06-19 21:22:19

标签: json treeview kendo-ui datasource

好的,我在这里遇到这种情况:

其中包含剑道树的CSHTML视图:

@(Html.Kendo().TreeView()
.Name("treeview")
.DataTextField("Name")
.DataSource(d => d.Read(r => r.Action("WorkedHours", "TaskManager")))
.Events(e => e.Select("onSelect"))
)
右侧有一个剑道网格。在树上方有一个(剑道)下拉列表来选择用户。

这是树调用的控制器方法:

 public JsonResult WorkedHours(uint? id)
    {
        DocObjectArray docObjects = null;
        if (id == null)
        {
            // get root elements
            var loggedInUserRef = OmanagerUtils.GetInstance().LoggedInUser;
            if (loggedInUserRef != null && loggedInUserRef.GetObject() != null && loggedInUserRef.GetObject().SubObjects != null)
            {
                for (int i = 0; i < loggedInUserRef.GetObject().SubObjects.GetLength(); i++)
                {
                    var item = loggedInUserRef.GetObject().SubObjects.GetAt(i);
                    if (item.ToString() == TaskManagerConstants.UserWorkHours)
                    {
                        docObjects = item.TreeSubObjects;
                        break;
                    }
                }
            }
        }
        else
        {
            // get sub objects of a root object
            var rootObj = new DocObjectRef((int)id);
            docObjects = rootObj.GetObject().TreeSubObjects;
        }
        var returnDocObjects = new List<OmanagerItem>();

        for (int i = 0; i < docObjects.GetLength(); i++)
        {
            var item = docObjects.GetAt(i);
            var hasChildren = true;
            if (item.TreeSubObjects == null)
            {
                hasChildren = false;
            }
            else
            {
                if (item.TreeSubObjects.GetLength() == 0)
                {
                    hasChildren = false;
                }
            }
            var listItem = new OmanagerItem
            {
                hasChildren = hasChildren,
                id = item.GetOID(),
                Name = item.ToString()
            };
            returnDocObjects.Add(listItem);
        }
        return Json(returnDocObjects, JsonRequestBehavior.AllowGet);
    }

现在,问题是我必须能够从下拉列表中选择一个用户并使用这个新数据刷新树。

$("#employee").kendoDropDownList({
                change: function () {
                    var postdata = {
                        id:$("#employee").val()
                    }
                    $.ajax({
                        url: "TaskManager/WorkedHours",
                        cache: false,
                        type: "POST",
                        data: postdata,
                        success: function (data) {
                            $("#treeview").data("kendoTreeView").setDataSource(data);
                        },
                    });
                }
            });

问题是我如何处理这些数据?因为我的尝试没有真正奏效。

非常感谢。

2 个答案:

答案 0 :(得分:1)

您可以在WorkedHours操作中使用OutputCache属性:

[OutputCache(NoStore = true, Duration = 0, VaryByParam = "None")]
public JsonResult WorkedHours(uint? id)
{
 // rest of method
}

在我的案例中有所帮助:))

答案 1 :(得分:0)

也许这个小片段对你有任何帮助。 与我的下拉列表更改事件中的代码类似,我调用的函数将更改我的TreeView数据源的请求数据。

更改后,它会调用数据源的read()处理程序,以便重新读取数据:

function loadTreeViewData() {
    var employee = $('#employee').getKendoDropDownList().dataItem();
    WorkedHoursDataSource.transport.options.read.data = {Employee_Id:employee.id};

    WorkedHoursDataSource.read();
}