Dans un POST à un contrôleur MVC, j'utilise JQuery pour envoyer un objet JSON avec deux propriétés: Id et Foos. Pour une raison quelconque, toutes les propriétés de chaque instance de FooModel sont toutes nulles/vides.asp.net mvc json deserializer ne fonctionne pas
est ici la méthode:
[HttpPost]
public ActionResult EditFoo(int Id, FooModel[] foos)
Ce sont mes paramètres de formulaire récupéré Fiddler (je peux confirmer que les données sont transmises au serveur). J'ai également validé avec deux débogueurs que l'objet JSON contient toutes les valeurs correctes.
Id 17934
Foos[0][Label] My Foo
Foos[0][Bars][0][Label] First Bar
Foos[0][Bars][0][Id] 1
Foos[0][Bars][1][Label] Second Bar
Foos[0][Bars][1][Id] 2
FooModel ressemble à ceci:
public class FooModel
{
public string Label { get; set; }
public IList<Bar> Bars { get; set; }
}
Dans la méthode EditFoo, je peux voir le tableau avec le bon nombre d'articles Foo (dans cet exemple, 1). Cependant, toutes les propriétés de chaque instance de FooModel sont toutes nulles/vides.
EDIT 1:
Pour clarifier: Je ne suis pas créer les paramètres de formulaire à la main. Je passe un vrai objet JSON à $ .ajax() à travers un ajaxArgs.data.
Les données de formulaire lui-même ressemble à ceci:
Id=17934&Foos%5B0%5D%5BId%5D=1&&Foos%5B0%5D%5BLabel%5D=My+Foo...
Et je ne peux pas trouver un moyen rapide pour obtenir le JSON lui-même comme une chaîne, mais c'est la variable assignée à ajaxArgs.data (le Foos ont toutes leurs propriétés):
var data = { Id: Model.Id, Foos: Model.Foos };
EDIT 2:
J'utilise JavaScriptSerializer pour créer une chaîne qui, comme ci-dessous:
public static string ToJson(this object obj)
{
var serializer = new JavaScriptSerializer();
var foo = serializer.Serialize(obj);
return foo;
}
puis rendre le modèle disponible à javascript dans la vue comme ceci:
<script type="text/javascript">
var Model = <%= Model.ToJson() %>;
</script>
J'ai mis à jour le post pour clarifier ... Je ne crée pas les params moi-même. Encore une fois, c'est exactement comme cela que Fiddler les affiche. –
@c_bit, le fait que Fiddler affiche les paramètres comme ceci signifie qu'ils sont envoyés comme ça et comme je l'ai expliqué dans ma réponse le classeur par défaut n'est pas capable de comprendre une telle syntaxe qui explique pourquoi vous obtenez des zéros. J'ai montré la syntaxe correcte dont vous avez besoin si vous voulez utiliser des paramètres de chaîne de requête. 'var data = {Id: Model.Id, Foos: Model.Foos};' ne fonctionnera tout simplement pas avec des collections de paramètres complexes. Vous pouvez essayer d'envoyer une requête JSON à la place, comme indiqué dans ma réponse. Pour cela, bien sûr, vous avez besoin d'un fournisseur de valeur JSON. MVC 3 est sorti de la boîte. –
Et voici un [article de blog] (http://haacked.com/archive/2010/04/15/sending-json-to-an-asp-net-mvc-action-method-argument.aspx) qui illustre comment envoyer des demandes JSON dans les versions antérieures de MVC 3. –