我一直在使用这个问题的一般想法和jqGrid Wiki上的评论中的一些代码,将jqGrid 中的所有行提交到一个操作方法。本质上,在提交时,我希望所有行数据都返回到控制器,以便我可以持久保存它。我尝试使用隐藏字段来存储所有行数据,但控制器似乎从来没有得到所有东西,只有网格中最后一个编辑的单元格。所以我改用 ajax 方法,但无论我尝试了什么,我都无法让 ajaxPOST
以 JSON 的形式出现。这是我现在拥有的:
$("#submitButton").click(function () {
$("#awesomeGrid").jqGrid('resetSelection');
var gridRows = $("#awesomeGrid").jqGrid('getRowData');
var rowData = new Array();
for (var i = 0; i < gridRows.length; i++) {
var row = gridRows[i];
rowData.push($.param(row));
}
var dataToSend = JSON.stringify(rowData);
$.ajax({
url: '@Url.Action("UpdateAwesomeGridData")',
type: 'POST',
data: { gridData: dataToSend },
dataType: 'json',
success: function (result) {
alert('success');
}
});
return true;
});
我的控制器方法签名:
[HttpPost]
public ActionResult UpdateAwesomeGridData(string gridData)
我尝试将gridData
参数从string
tostring[]
更改object[]
为各种东西,但似乎没有任何效果。如果我将其保留为string
,我会得到数据,但格式很古怪,就像这样(替换了列名):
gridData=["Id=1&Field1=1945&Field2=0&Field3=0&Field4=1&Field5=Some+string+value&Field6=&Field7=&Field8=&Field9s=","Id=2&Field1=1945&Field2=0&Field3=0&Field4=2&Field5=Another+string+value&Field6=&Field7=&Field8=&Field9s=","Id=3&Field1=1945&Field2=0&Field3=0&Field4=3&Field5=Yet+another+string&Field6=&Field7=&Field8=&Field9s=","Id=4&Field1=1945&Field2=0&Field3=0&Field4=4&Field5=Final+string&Field6=&Field7=&Field8=&Field9s="]
我从 Fiddler 那里得到了这个,为了记录,当我摆弄它时,JSON 选项卡没有显示任何请求。有没有办法可以 JSON 化这个数组并在一次调用中发送它?我的操作方法上的参数是什么类型?
编辑 - 解决方案
对于其他像我一样愚蠢的人,这是我如何让它工作的:
首先,根据 Oleg 的建议,我添加loadonce: true
了 jqGrid 定义。然后,将我的提交按钮功能更改如下:
$("#submitButton").click(function () {
var griddata = $("#awesomeGrid").jqGrid('getGridParam', 'data');
var dataToSend = JSON.stringify(griddata);
$.ajax({
url: '@Url.Action("UpdateAwesomeGridData")',
type: 'POST',
contentType: 'application/json; charset=utf-8',
data: dataToSend,
dataType: 'json',
success: function (result) {
alert('success: ' + result.result);
}
});
return true;
});
然后,更改了我的控制器方法签名:
public ActionResult UpdateAwesomeGridData(IEnumerable<GridBoundViewModel> gridData)
希望这对将来的某人有所帮助。