2011-02-10 7 views
1

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> 

Répondre

2

Le problème est que le classeur de modèle par défaut ne comprend pas une demande comme celle que vous avez montrée. Vos valeurs de demande devraient ressembler à ceci:

Id       17934 
Foos[0].Labe     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 

ou si vous utilisez ASP.NET MVC 3 JSON demande fournisseur d'usine vous pouvez envoyer une demande JSON comme ceci:

$.ajax({ 
    url: '/foo', 
    type: 'POST', 
    data: JSON.stringify({ 
     Id: 17934, 
     Foos: [ 
      { 
       Bars: [ 
        { Label: 'First Bar', Id: 1 }, 
        { Label: 'Second Bar', Id: 2 } 
       ] 
      } 
     ] 
    }), 
    contentType: 'application/json', 
    success: function(result) { 
     alert('success');  
    } 
}); 

qui doit envoyer les documents suivants request:

{ Id: 17934, Foos: [ { Bars: [ { Label: 'First Bar', Id: 1 }, { Label: 'Second Bar', Id: 2 } ] } ] } 
+0

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. –

+1

@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. –

+0

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. –

0

Vous utilisez de manière incorrecte entre parenthèses. Ce:

Foos[0][Bars][0][Label] 

devrait ressembler à ceci:

Foos[0].Bars[0].Label 

De plus, ce n'est pas JSON, ils sont des paramètres sous forme de POST.

+0

C'est exactement comme cela que Fiddler représente les params de formulaire.J'obtiendrai un échantillon JSON –

+0

@c_bit, oui, je suis sûr que c'est comme ça que Fiddler les représente, mais c'est aussi parce que c'est comme ça qu'on les envoie. jQuery vous permet d'envoyer des données via AJAX en utilisant une variété de mécanismes, y compris les deux formes POST * et * JSON. Vous utilisez clairement la variante POST du formulaire et la partie ** name ** des paires nom/valeur est mal formatée pour le classeur modèle ASP.NET MVC. –

+0

Je ne sais pas si je comprends, la méthode est POST. Les données sont un objet JSON. –

Questions connexes