从视图提交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; } }