Kendo序列化的Javascript数组网格对象属性在服务器上为null

Javascript array grid object property serialized by Kendo is null on server

本文关键字:服务器 null 属性 对象 序列化 Javascript 数组 网格 Kendo      更新时间:2023-09-26

我有一个Kendo网格,我有一份可编辑的细节模板。在详细信息模板中,我有一个多选。

保存时,我会手动更新dataItem,以获取详细信息模板多选中的最新选项。从多选中获取数据没有问题。实际上,在我触发网格进行保存之前,一切看起来都很好。

我将多选项目添加到网格的数据项目中,代码为:

function SaveRefItemSubCategories() { //Called on Save button click
    var grid = $("#RefItemSubCategoryGrid").data("kendoGrid");
    for (var i = 0; i < grid.dataSource._data.length; i++) {
        var dataItem = grid.dataSource._data[i];
        dataItem.RefItemCategoryServiceIDs = [];
        var ms = $("#MultiSelect_" + dataItem.uid).data("kendoMultiSelect");
        var values = ms.value();
        for(var x = 0; x < values.length; x++) {
            dataItem.RefItemCategoryServiceIDs.push(values[i]);
        }
    }
    grid.dataSource.sync();
}

此时,当我查看发布到服务器上的内容时,对于序列化的多选项,网格的dataSource如下所示:

型号[0]。RefItemCategoryServiceIDs[]15

&型号%5B0%5D.RefItemCategoryServiceIDs%5B%5D=15

它应该是这样的:

models[0]。RefItemCategoryServiceIDs[0]15

&型号%5B0%5D.RefItemCategoryServiceIDs%5B0%5D=15

抱歉那里有多余的空间,我无法将其加粗,否则

序列化数据中缺少数组的索引导致该属性在到达服务器时为null。该属性的类型为List

我尝试了几种不同的方法,但最终在dataItem上创建了新的属性,这些属性在我第一次保存后仍然存在并导致问题。

我用了一些例子来代替push()方法:

  • 这一个确实会发回数据,但它会忽略现有列表,并为每个数组索引创建一个新的dataSource属性。如果我只保存一次,这会起作用,但如果我多次保存网格,那么添加的属性就会粘在一起,破坏数据的完整性。如果保存后可以"重置"dataSource(无需重新加载网格),我会接受这个选项。

    dataItem["RefItemCategoryServiceIDs["+i+"]"]=值[i];

  • 这个与.push()具有相同的效果,后者是我在服务器上的对象的属性,为空

    dataItem.RefItemCategoryServiceIDs[i]=值[i];

如果我能提供更多信息,请让我知道,并提前感谢!

我不相信这是处理它的最佳方法,但我已经找到了一种有效的方法。

我更改了添加到数据项属性的内容:

for(var x = 0; x < values.length; x++) { //values is array from multiselect
        dataItem.RefItemCategoryServiceIDs.push(values[i]);
}

到此:

for (var i = 0; i < values.length; i++) { //values is array from multiselect
            dataItem["RefItemCategoryServiceIDs[" + i + "]"] = values[i];
}

只是这个改变适用于除此之外的所有场景:

  1. 保存行时,从多选中选择2个选项,从而将2个属性添加到dataItem。我们会说这些物品的ID是1和21。发布的数据如下:

    models[0]。RefItemCategoryServiceIDs[0]=1models[0]。RefItemCategoryServiceIDs[1]=21

  2. 保存后,如果我们再次打开多选并删除第一个选项(ID为1的选项),我们会收到以下数据:

    models[0]。RefItemCategoryServiceIDs[0]=21models[0]。RefItemCategoryServiceIDs[1]=21

这显然是不对的(应该只是一个ID设置为21的条目)。之所以会发生这种情况,是因为RefItemCategoryServiceID实际上不是一个数组,只是名称看起来像数组条目的属性,以便它们序列化到服务器上的列表中(据我所知)。为了缓解这个问题,我在映射当前多选值以删除与此数组关联的现有属性的代码之前:

function CleanDataItemLists(dataItem) {
    if (dataItem.RefItemCategoryCarrierIDs != undefined && dataItem.RefItemCategoryCarrierIDs.length > 0) {
        var i = 0;
        //Continues to remove properties by index until none are left
        while (dataItem.RefItemCategoryCarrierIDs[i] != undefined) {
            delete dataItem["RefItemCategoryCarrierIDs[" + i + "]"];
            i++;
        }
        //Cleans up empty array property
        delete dataItem.RefItemCategoryCarrierIDs;
    }
    return dataItem;
}

调用此函数后,您可以执行上面引用的for循环代码,并且数据在存在索引的情况下进行序列化(请参阅最初的文章,以获取序列化数据中缺少索引的示例),从而允许服务器将其映射到列表对象。正如我所说,我不相信这是最好的方法,但它确实对我有效。希望这能帮助其他人或带来更好的答案。