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
Vous devez vous connecter pour publier un commentaire.
Je vois beaucoup de problème qui vous a.
Le premier problème est que vous utilisez
$.param(row)
et remplir le tableaurowData
avec codées (???!!!) les données. Je pense que le bon code doit contenir l'affichage direct des données renvoyées pargetRowData
:data: { gridData: gridRows }
. Du côté serveur, vous pouvez utiliserUpdateAwesomeGridData(string gridData)
et ensuite de les convertirgridData
à laList<List<string>>
par exemple parJe voudrais aller un pas en arrière et poser la question: pourquoi vous avez besoin d'envoyer les données au serveur ce qu'il a déjà? Si vous avez besoin d'un but toutes les données de la grille, vous pouvez simplement utiliser la même action de contrôleur de générer les données et ainsi vous aurez les mêmes données déjà sur le serveur.
L'envoi de données vers le serveur peut être nécessaire que dans un scénario: vous avez utilisé
loadonce: true
, a modifié les données localement et à la fin de modifications que vous avez besoin d'envoyer toutes les données modifiées sur le serveur. Dans le cas de l'utilisation degetRowData
serait pas le meilleur choix parce que vous obtenir les données à partir de la page actuelle uniquement. Pour obtenir toutes les données que vous devriez mieux utilisergetGridParam("data")
.loadonce: true
.Vous êtes les bienvenus!
OriginalL'auteur Oleg
Je vois Oleg a déjà répondu à votre question, et je n'ai aucun moyen de le remplacer, mais j'ai pensé à partager mon idée ici. Je pense que le transfert de données comme un objet MVC contrôleur fait plus de sens que tout simplement les cordes et puis vous pouvez passer à l'objet de votre classe DAO.
Voici mon code jQuery (évidemment grâce à Oleg pour ce code).
Et voici ma MVC code.
OriginalL'auteur user2026504
code envoyé depuis la Page Jsp:
Classe D'Action:
OriginalL'auteur user3433027