La soumission de jqGrid des données de ligne de vue pour contrôleur - quelle méthode?

J'ai travaillé sur la présentation de toutes les lignes à partir d'un jqGrid à une méthode d'action à l'aide de l'idée générale de cette question et un peu de code à partir d'observations sur le jqGrid Wiki. Essentiellement, sur soumettre, je veux que TOUTES les données de la ligne, pour en revenir au contrôleur afin que je puisse persister. J'ai essayé d'utiliser un champ caché pour stocker toutes les données de la ligne, mais le contrôleur ne semble jamais obtenir tout, seule la dernière édition de la cellule dans la grille. Donc je suis passé à une approche ajax, mais peu importe ce que j'ai essayé je ne peux pas obtenir l'ajax POST à venir à travers comme JSON. Voici ce que j'ai en ce moment:

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

Et mon contrôleur de la signature de la méthode:

[HttpPost]
public ActionResult UpdateAwesomeGridData(string gridData)

J'ai essayé de changer les gridData paramètre de string à string[] à object[] à toutes sortes de choses, et rien ne semble fonctionner. Si je laisse comme string, je reçois les données, mais le format est tous plus loufoques, comme ceci (les noms de colonne substitué):


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="]

J'ai eu de la Fiddler, et pour l'enregistrement, le JSON onglet affiche rien pour la demande quand j'ai bricoler. Est il possible que je peux JSON-identifier ce tableau et l'envoyer en un seul appel? Quel est le type de mon paramètre sur ma méthode d'action?

EDIT - Solution

Pour toutes les autres personnes qui sont aussi stupide que je suis, voici comment je l'ai eu à travailler:

D'abord, sur Oleg suggestion, j'ai ajouté loadonce: true à la jqGrid définition. Ensuite, changé mon bouton soumettre fonction comme suit:

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

Puis, changé mon contrôleur de la signature de la méthode:

public ActionResult UpdateAwesomeGridData(IEnumerable<GridBoundViewModel> gridData)

Espère que cela aide quelqu'un dans l'avenir.

OriginalL'auteur AJ. | 2012-05-24