4

我一直在使用这个问题的一般想法和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参数从stringtostring[]更改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)

希望这对将来的某人有所帮助。

4

3 回答 3

4

我看到你有很多问题。

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

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

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

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

于 2012-05-24T21:03:54.387 回答
0

我看到奥列格已经回答了你的问题,我无意覆盖它,但我想在这里分享我的想法。我认为将数据作为对象传递给 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<RuleData> detaildata)
    {

       RuleManager _savedata = new RuleManager();
       _savedata.Save(detaildata);
        var jsonData = "success";
        return Json(jsonData, JsonRequestBehavior.AllowGet);

    }
于 2013-10-11T16:52:22.517 回答
0

从 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 = $('<ul id="details">');
                        for (i = 0; i < jsonArray.length; i++) {
                            $("#details").append('<li id="' + i + '" name="head" >' + jsonArray[i].name + '</li>');
                        }
                        $('#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<string, string>(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;
        }
    }
于 2014-04-03T13:03:31.647 回答