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パラメータを から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)

これが将来誰かに役立つことを願っています。

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);

一歩戻って質問したいのですが、なぜすでにサーバーにデータを送信する必要があるのでしょうか。何らかの目的でグリッドからのすべてのデータが必要な場合は、データを生成するコントローラーの同じアクションを使用できるため、サーバー上に同じデータが既に存在します。

サーバーへのデータの送信は、1つのシナリオでのみ必要になります。つまり、データをローカルでloadonce: true使用、変更し、変更の最後に、変更したすべてのデータをサーバーに送信する必要があります。の使用法は、現在のページからのみデータを取得するため、最良の選択ではありません。すべてのデータを取得するには、を使用することをお勧めします。getRowDatagetGridParam("data")

于 2012-05-24T21:03:54.387 に答える
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 に答える
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 に答える