我正在使用带有MVC的Kendo Treeview将嵌套数据绑定到2个树,如Kendo示例中所示 . 我在JS中添加了Drop事件处理程序,以捕获从一个树拖动到另一个树的节点的节点数据以及它被丢弃的节点数据 . 使用此JS读取数据:

function onDropLeft(e) {
    var tree = $('#treeview-left').data("kendoTreeView");
    var item = tree.dataItem(e.sourceNode);
    var tree2 = $('#treeview-right').data("kendoTreeView");
    var item2 = tree2.dataItem(e.dropTarget);
    console.log('Source Data' + '\nItem ID: ' + item.ItemID  + 
       '\nItem Name: ' + item.ItemName + '\nItem Type: ' + item.ItemType);

当我使用DataSource和.Read与MVC调用将数据绑定到树时,它工作得很好:

.DataSource(dataSource => dataSource
        .Read(read => read
            .Action("Employees", "TreeView")
        )
    )

绑定到类似于此的对象:

public class TreeModel
{
    public int ItemID { get; set; }
    public string ItemName { get; set; }
    public string ItemType { get; set; }
    public List<TreeModel> Items { get; set; }
}

JS代码可以读取 item.ItemIDItem.ItemType 等属性 .

但是当我开始使用BindTo()并使用映射将我的树绑定到数据时,dataItem()方法不再能够看到底层数据 . 相反,它只看到 item.IDitem.Text ,TreeViewItem对象的内置属性,在此处的代码中定义和使用:

.BindTo((IEnumerable<TreeModel>)ViewBag.DefaultInlineData,   
(NavigationBindingFactory<TreeViewItem> mappings) =>
{
    mappings.For<TreeModel>(binding => binding.ItemDataBound((item, node) =>
    {
       item.Id = node.ItemID.ToString();
       item.Text = node.ItemName;
       item.Expanded = node.Expanded;
    })
    .Children(node => node.Children));
 })

我创建了这个树绑定使用的底层对象TreeModel:

public class TreeModel
{
    public TreeModel()
    {
        this.Children = new List<TreeModel>();
        this.Expanded = true;
    }
    public int ItemID { get; set; }
    public string ItemName { get; set; }
    public string ItemType { get; set; }
    public bool Expanded { get; set; }
    public bool HasChildren { get { return Children.Any(); }}
    public IList<TreeModel> Children { get; set; }
}

我如何构建数据的小样本:

public IEnumerable<TreeModel> DataDriven()
    {
        List<TreeModel> models = new List<TreeModel>();
        TreeModel model = new TreeModel()
        {
            ItemID = 1,
            ItemName = "Car1",
            ItemType = "Car"
        };
        model.Children.Add
           (new TreeModel() { ItemID = 7, ItemName = "Truck7", 
           ItemType = "Truck" });
        models.Add(model);
        return models.ToArray();
    }

这符合此网站上另一篇文章中显示的代码,如下所示:Binding Asp.net MVC model data to a kendo TreeView template (local data)

所以这就是问题:我在树绑定中使用的映射有效地消除了TreeModel对象的底层属性,例如ItemID,ItemName,ItemType,并在JS函数中显示'undefined' . 当我打电话时,这表现出来

`var tree = $('#treeview-left').data("kendoTreeView");
var item = tree.dataItem(e.sourceNode);`

对于树使用绑定和映射的最佳选择是什么,它仍然能够正确绑定并暴露绑定对象的属性?