在内联编辑之后,免费的jqgrid使用POST方法向ASP.NET MVC4 WebAPI控制器发送可变数量的列。 发布的数据包含下面的json字符串。
在POST正文中发布到控制器的json字符串看起来像:{"Toode":"","Kogus":"0.0000",
"Nimetus":"1","Mootyhik0_nimetus":"",
"Reanr":"2",
"_oper":"edit","_rowid":"1673",
"_dokdata":"[
{\"name\":\"Maksetin1_tingimus\",\"value\":\"\"},
{\"name\":\"Kinnitatud\",\"value\":\"False\"}]"
}
它有3个属性区域:
"Toode":"","Kogus":"0.0000","Nimetus":"1","Mootyhik0_nimetus":"",
"Reanr":"2"
此列表可能会根据用户首选项在运行时更改。这是使用jqgrid extraparam: getDetails()
设置创建的。
使用下划线“_oper”声明的固定属性:“edit”,“_ rowid”:“ 那些是 始终存在_oper和_rowid jqgrid会自动添加它们。
订单数据。固定属性_dokdata
,其中包含json数组的动态属性{\"name\":\"Maksetin1_tingimus\",\"value\":\"\"},{\"name\":\"Kinnitatud\",\"value\":\"False\"}
这是从jqgrid colmodel。
创建的此列表可能会在运行时更改,并且可能包含与p.1订单详细信息相同的属性名称。
如何在控制器中获取此数据?可能它应该解析为两个词典。是否可以强制WebAPI将此数据作为类/集合传递给控制器,还是应该手动解析?
jqgrid设置来自回答Using jqGrid's inline-editing with RESTful urls? 如果这使得数据传递更合理,那么这些和序列化方法可以改变。 生成的WebAPI应该具有易于理解的数据格式(良好的API),因为它也将被第三方应用程序使用。
$.extend($.jgrid.defaults, {
ajaxRowOptions: { contentType: "application/json", async: true },
serializeRowData: function (data) {
var propertyName, propertyValue, dataToSend = {};
for (propertyName in data) {
if (data.hasOwnProperty(propertyName)) {
propertyValue = data[propertyName];
if ($.isFunction(propertyValue)) {
dataToSend[propertyName] = propertyValue();
} else {
dataToSend[propertyName] = propertyValue;
}
}
}
return JSON.stringify(dataToSend);
}
});
更新
serializeRowData更改为
serializeRowData: function (data) {
return JSON.stringify({
headerData: $("#_form").serializeArray(),
rowData: data
} );
}
这会为headerData:
生成膨胀的json{"headerData": [
{"name":"Tasudok","value":"134"},
{"name":"Kuupaev","value":"2015-11-23"},
{"name":"Dokumnr","value":"135319"}
],
"rowData": {"Toode":"",
"Kogus":"0.0000",
"Nimetus":"öäölä<a",
"_rowsum":"0.00",
"Id":"1639",
"Dokumnr":"135319",
"_oper":"edit",
"_rowid":"1639"
}
}
如何从headerData中删除name和value属性,使其包含属性名称和值对,如rowData:
headerData: {
"Tasudok": "134",
"Kuupaev": "2015-11-23",
"Dokumnr": "135319"
}