J'essaie d'obtenir une liste d'articles de ligne sur une page web en utilisant JSON, qui sera ensuite manipulée et renvoyée au serveur par une requête ajax en utilisant la même structure JSON qu'à l'arrivée (sauf que la valeur d'un champ a été modifiée).
Recevoir des données du serveur est facile, la manipulation encore plus facile ! mais renvoyer ces données JSON au serveur pour les sauvegarder... temps de suicide ! S'il vous plaît, que quelqu'un m'aide !
Javascript
var lineitems;
// get data from server
$.ajax({
url: '/Controller/GetData/',
success: function(data){
lineitems = data;
}
});
// post data to server
$.ajax({
url: '/Controller/SaveData/',
data: { incoming: lineitems }
});
C# - Objets
public class LineItem{
public string reference;
public int quantity;
public decimal amount;
}
C# - Contrôleur
public JsonResult GetData()
{
IEnumerable<LineItem> lineItems = ... ; // a whole bunch of line items
return Json(lineItems);
}
public JsonResult SaveData(IEnumerable<LineItem> incoming){
foreach(LineItem item in incoming){
// save some stuff
}
return Json(new { success = true, message = "Some message" });
}
Les données arrivent au serveur sous forme de données post sérialisées. Le liant de modèle automatisé essaie de lier IEnumerable<LineItem> incoming
et obtient étonnamment le résultat suivant IEnumerable
a le nombre correct de LineItems
- il ne les remplit pas avec des données.
SOLUTION
En utilisant les réponses d'un certain nombre de sources, principalement djch
sur un autre post de stackoverflow et BeRecursive
ci-dessous, j'ai résolu mon problème en utilisant deux méthodes principales.
Côté serveur
Le désérialiseur ci-dessous nécessite une référence à System.Runtime.Serialization
y using System.Runtime.Serialization.Json
private T Deserialise<T>(string json)
{
using (var ms = new MemoryStream(Encoding.Unicode.GetBytes(json)))
{
var serialiser = new DataContractJsonSerializer(typeof(T));
return (T)serialiser.ReadObject(ms);
}
}
public void Action(int id, string items){
IEnumerable<LineItem> lineitems = Deserialise<IEnumerable<LineItem>>(items);
// do whatever needs to be done - create, update, delete etc.
}
Côté client
Il utilise la méthode stringify de json.org, disponible dans cette dépendance. https://github.com/douglascrockford/JSON-js/blob/master/json2.js (qui fait 2.5kb une fois minifié)
$.ajax({
type: 'POST',
url: '/Controller/Action',
data: { 'items': JSON.stringify(lineItems), 'id': documentId }
});
0 votes
Essayez d'envelopper les données dans une chaîne, par exemple : data : "{contenu :" + contentString + "}"