J'ai des problèmes pour recevoir des valeurs json de ma requête javascript/jQuery vers mon contrôleur.ASP.NET MVC2 Lecture de données JSON avec le contrôleur
MyClass se présente comme suit:
function MyClass() {
this.MyString = null;
this.MyInt = null;
this.Subs = null;
}
Ma demande se présente comme suit:
var testData1 = new MyClass();
testData1.MyInt = 1234;
testData1.MyString = "abcDEF";
testData1.Subs = new Array();
var testData2 = new MyClass();
testData2.MyInt = 5678;
testData2.MyString = "GHIjkl";
testData1.Subs.push(testData2);
var jsonData = JSON.stringify(testData1);
var self = this;
$.ajax({
url: '/Home/Request',
type: 'POST',
dataType: 'json',
data: jsonData,
contentType: 'application/json; charset=utf-8',
success: function (x) {
self.ParseResult(x);
}
});
Maintenant, j'ai un contrôleur:
public JsonResult Request(MyClass myObj)
{
var answer = ...
return Json(answer, JsonRequestBehavior.DenyGet);
}
Avec la classe suivante:
public class MyClass
{
public string MyString { get; set; }
public int MyInt { get; set; }
public List<MyClass> Subs { get; set; }
}
Tous les noms dans jsonData sont exactement les mêmes que dans ma classe "MyClass". Mais il n'y a pas de valeurs dans myObj.
Où est le problème. Y at-il quelque chose que je peux faire pour que cette cartographie fonctionne correctement?
Merci beaucoup à l'avance,
Chris
MISE À JOUR:
Merci pour votre repley. J'ai utilisé le JavascriptSerializer. Mais j'ai le problème, que myString est null:
public JsonResult Data(string myString)
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
var data = serializer.Deserialize<MyClass>(myString);
var answer = ...
return Json(answer, JsonRequestBehavior.DenyGet);
}
Où est la valeur? Devrais-je prendre la valeur à partir des données de demande?
Ward @ Dave
Vous deuxième solution fonctionne. Mais j'ai un problème avec les sous-marins.
var testData1 = new MyClass();
testData1.MyInt = 1234;
testData1.MyString = "abcDEF";
testData1.Subs = new Array();
for (var i = 0; i < 10; i++) {
var testData2 = new MyClass();
testData2.MyInt = i;
testData2.MyString = "abcDEF";
testData1.Subs.push(testData2);
}
Je reçois 10 Subs dans mon contrôleur, mais tous sont vides. Que puis-je faire?
Ward @ Dave, @ALL
En utilisant les paramètres traditionnels mes 10 Subs sont bot vides, ils ne sont pas là. Le nombre d'abonnements est 0 (pas NULL). J'ai essayé de changer le type de sous de liste en IEnumerable mais cela n'a pas aidé. Savez-vous quoi que ce soit d'autre que je puisse faire pour que Subs remplisse mon contrôleur?
Ok, merci Dave Ward, je vais utiliser la méthode JSON.
Pour quelqu'un d'autre d'avoir le même problème ce code contrôleur pourrait être de l'aide:
MemoryStream ms = new MemoryStream(Encoding.Unicode.GetBytes(myString));
var serializer = new DataContractJsonSerializer(typeof(MyClass));
MyClass se = serializer.ReadObject(ms) as MyClass;
ms.Close();
Merci pour votre réponse. Votre deuxième solution fonctionne très bien. Le seul problème que j'ai avec les "Subs". J'ai mis à jour mon poste original pour mieux formater mon message. – Chris
Je crois que vous devrez également utiliser la sérialisation "traditionnelle" de jQuery. J'ai mis à jour le code $ .ajax() dans ma réponse. –
Avec la sérialisation "traditionnelle", le nombre de sous-composants du contrôleur est 0. – Chris