この質問の一般的なアイデアと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
に変更してみましたがstring[]
、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 化して 1 回の呼び出しで送信する方法はありますか? アクション メソッドのパラメーターはどのような型になりますか?
編集 - 解決策
私と同じくらい愚かな他の人のために、これを機能させる方法を次に示します。
まず、オレグの提案で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)
これが将来誰かに役立つことを願っています。