Kendo序列化的Javascript数组网格对象属性在服务器上为null
Javascript array grid object property serialized by Kendo is null on server
我有一个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];
}
只是这个改变适用于除此之外的所有场景:
保存行时,从多选中选择2个选项,从而将2个属性添加到dataItem。我们会说这些物品的ID是1和21。发布的数据如下:
models[0]。RefItemCategoryServiceIDs[0]=1models[0]。RefItemCategoryServiceIDs[1]=21
保存后,如果我们再次打开多选并删除第一个选项(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循环代码,并且数据在存在索引的情况下进行序列化(请参阅最初的文章,以获取序列化数据中缺少索引的示例),从而允许服务器将其映射到列表对象。正如我所说,我不相信这是最好的方法,但它确实对我有效。希望这能帮助其他人或带来更好的答案。
- 数组在递归方法中设置为null
- 使用JSP从服务器检索和显示图像
- 如何使用skip参数使用angular ui引导进行服务器端分页
- 客户端服务器REST API captcha实现
- 正在将base64 jpeg从input-type=file上传到服务器
- Webpack开发服务器和React服务器端渲染
- 提示使用服务器端事件处理程序激活JavaScript
- 使用谷歌应用程序脚本将服务器端数据表返回到客户端
- 字符串在将其传递给另一个活动Android JavaScript时读取Null
- 如何使用Socket.io将命令从客户端发送到服务器
- "无法获取/null”;当使用nodejs运行服务器时
- 如果JS会话变量为null,如何避免500内部服务器错误
- 添加到序列化数组中的复杂对象在服务器端始终为 null
- 将剑道网格与服务器端筛选器和服务器端排序结合使用,字段 = NULL
- Kendo序列化的Javascript数组网格对象属性在服务器上为null
- 从客户端到服务器的SocketIO回调没有'不起作用(改为null对象)
- 我如何发送null select2值到服务器
- 添加“;b服务器端":数据表中的true给出错误TypeError:g为null
- Google Apps脚本中的成功处理程序从服务器函数接收null
- 客户端successHandler为null,但服务器日志显示结果