2010-09-03 7 views
1

Contexte:Comment accepter JSON dans la méthode d'action MVC2 comme paramètre et le désérialiser automatiquement?

  1. J'ai un projet MVC2 et je suis en utilisant jQuery 1.4.2.
  2. J'ai une classe .NET que je mets dans une vue en utilisant un JsonResult.
  3. La page utilise ensuite jQuery pour effectuer des opérations qui aboutiront aux propriétés de l'objet placé sur la page par l'élément (2) ci-dessus.
  4. Lorsqu'un élément de page donné est cliqué jQuery $ .post est la méthode de retour à l'action JSON.stringify (myObj).

Ce que je voudrais être en mesure d'avoir est quelque chose comme:

[HttpPost] ViewResult publique MonAction (MyClass Minime) {}

... MyClass serait la Classe .NET pour désérialiser le JSON dans lequel il devrait être bon étant donné que c'était le type MyClass qui avait "return Json (MyClass);"

À l'heure actuelle, ce que je vois est que le paramètre d'objet est nul ou n'a pas de valeurs comme défini par le code JS/jQuery. Si j'essaie:

MyClass foo = new MyClass(); UpdateModel (toto);

Il ne génère pas d'exception mais ne remplit pas non plus la classe.

Quelqu'un a des idées sur la façon de résoudre ce problème? Ou comment traiter JSON renvoyé à la méthode d'action et l'obtenir dans une classe.

Répondre

2

Si vous avez une action

[HttpPost] 
public JsonResult MyAction(MyClass minime) 

où, par exemple

public class MyClass { 
    public string Name { get; set; } 
    public int Age { get; set; } 
} 

vous devez remplir toutes les propriétés de la classe MyClass comme un paramètre. Les données d'entrée ne doit pas être au format JSON:

$.ajax({ 
    url: '/MyController/MyAction', 
    data: { name: "Peter", age: 33 }, 
    dataType: 'json', 
    traditional: true, 
    type: 'POST', 
    success: function (data) { 
     // get data which are already deserialized from JSON 
    } 
}); 

Si vous avez DateTime propriétés en lecture JSON Date parameter passed to MVC Action is always null.

+0

Je vais examiner cela pour voir si cela fonctionne. Le problème principal serait que ma classe dans .NET a un tableau de classes comme: class Myclass { public int Id {get; set;} public int SubClass [] Sous-classes {get; set;} } class SubClass { public string Nom {get; set;} public int [] Valeurs {get; ensemble; } } Chaque sous-classe 'pourrait avoir un tableau de valeurs d'une longueur différente. Par conséquent, le JS doit poster des choses qui ne sont pas si simples. Des idées comment je posterais quelque chose d'aussi complexe que ça. – Peter

+0

Les actions MVC sont conçues pour être utilisées en tant qu'entrées de formulaires. Les formulaires ont toujours seulement des propriétés nommées. Si vous voulez transférer des données pures sur le serveur Web, vous devriez créer un service WCF ou ASMX qui renvoie JSON et qui peut faire partie du même site Web. L'autre façon est de déclarer une méthode avec un paramètre 'string'' minime' et d'utiliser 'data: {minime: JSON.stringify (minime)} 'et' contentType: application/json' comme paramètre 'jQuery.ajax' et utilisent' JavaScriptSerializer ser = new JavaScriptSerializer(); MyClass inst = ser.Deserialize (minime); 'inside de' MyAction' pour convertir la chaîne d'entrée. – Oleg

+0

Le paramètre 'contentType' devrait être' contentType: "application/json; charset = utf-8" ' – Oleg

Questions connexes