从视图提交jqGrid行数据到控制器 – 什么方法?

我一直在使用这个问题的一般想法和jqGrid Wiki上的注释中的一些代码,将jqGrid中的所有行提交到一个动作方法。 基本上,在提交时,我希望所有行数据都返回到控制器,这样我就可以坚持下去。 我已经尝试使用隐藏字段来存储所有行数据,但控制器似乎永远不会得到所有内容,只有网格中最后编辑的单元格。 所以我改用ajax方法,但无论我尝试过什么,我都无法得到ajax POST作为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-ify这个数组并在一次调用中发送它? 我的参数对我的动作方法有什么类型?

编辑 – 解决方案

对于像我一样愚蠢的任何其他人,这是我如何让它工作:

首先,根据Oleg的建议,我在jqGrid定义中添加了loadonce: true 。 然后,更改我的提交按钮function如下:

 $("#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 gridData) 

希望这可以帮助将来的某个人。

我看到你遇到很多问题。

第一个问题是你使用$.param(row)并用编码的(??? !!!)数据填充数组rowData 。 我认为正确的代码应该包含从getRowData返回的数据的直接发布: data: { gridData: gridRows } 。 在服务器端,您可以使用UpdateAwesomeGridData(string gridData) ,然后将gridData转换为List> ,例如

 JavaScriptSerializer serializer = new JavaScriptSerializer(); var myListOfData = serializer.Deserialize>>(gridData); 

我想退一步问一下这个问题:为什么你需要将数据发送到已有的服务器? 如果您出于某种目的需要来自网格的所有数据,您可以使用生成数据的控制器的相同操作,因此您将在服务器上拥有相同的数据

只有在一种情况下才需要向服务器发送数据:您使用了loadonce: true ,在本地修改了数据,在修改结束时您需要将所有已更改的数据发送到服务器。 在这种情况下,使用getRowData不是最佳选择,因为它只能从当前页面获取数据。 要获取所有数据,最好使用getGridParam("data")

我看到奥列格已经回答了你的问题,我无意覆盖它,但我想在这里分享我的想法。 我认为将数据作为对象传递给MVC控制器比仅仅使用字符串更有意义,然后您可以将该对象传递给DAO类。

这是我的jQuery代码(显然感谢Oleg的代码)。

  var ruledetail = new Array(); var grid = $('#RuleCriteria')[0], rows = grid.rows, cRows = rows.length, iRow, iCol; var fromvalue; for (iRow = 0; iRow < cRows; iRow++) { row = rows[iRow]; // row.id is the rowid if ($(row).hasClass("jqgrow")) { cellsOfRow = row.cells; //build rule detail data ruledetail.push({ ColumnName: jQuery('#RuleCriteria').jqGrid('getCell', row.id, 'ColumnName'), ColumnOperator: jQuery('#RuleCriteria').jqGrid('getCell', row.id, 'ColumnOperator'), FromValue: fromvalue, ToValue: $(cellsOfRow[4]).text(), Connector: jQuery('#RuleCriteria').jqGrid('getCell', row.id, 'Connector') }); } } var ruledata = JSON.stringify({ 'detaildata': ruledetail }); $.ajax({ url: "@Url.Action("CreateRules", "Admin")", data: ruledata, type: "POST", dataType: "json", contentType: "application/json; charset=utf-8", success: function () { $(".Message").displayMessage("@Msg.Success"); setTimeout(function () { location.href = "@Url.Action("Rule", AppType)"; }, 1000); }, error: function () { $(".Message").displayError("@Msg.GeneralError"); } }); 

这是我的MVC代码。

  [HttpPost] public ActionResult CreateRules(List detaildata) { RuleManager _savedata = new RuleManager(); _savedata.Save(detaildata); var jsonData = "success"; return Json(jsonData, JsonRequestBehavior.AllowGet); } 

代码从Jsp页面发送:

  $.ajax({ type: "POST", contentType: "application/json; charset=utf-8", dataType: "json", url: "LoadDataservice.asmx/SaveData", async: true, data: '{"formData":"' + $('#check-user').serialize() + '"}', // working dataType: "json", success: function (msg) { $('#details').empty(); jsonArray = $.parseJSON(msg.d); var $ul = $('
    '); for (i = 0; i < jsonArray.length; i++) { $("#details").append('
  • ' + jsonArray[i].name + '
  • '); } $('#details').listview('refresh'); }, error: function (msg) { alert("Error"); } });

行动类:

  public string SaveData(string formData) { string s = formData; var keyValuePairs = from array in (from kvpString in s.Split('&') select kvpString.Split('=')) select new KeyValuePair(array[0].Trim(), array[1].Trim()); var dictionary = keyValuePairs.ToDictionary(kvp => kvp.Key, kvp => kvp.Value); var username = dictionary["username"]; var password = dictionary["password"]; string details = "testing"; return details; } }