2012-05-24 2 views
0

I avaitasp.net MVC 3 - charge utile lecture POST dans la méthode de commande paramterized

[HttpPost]   
public ActionResult Foo() 
{ 
    // read HTTP payload 
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength)); 
.... 
} 

La charge utile est application/json; a bien fonctionné; puis j'ai changé à

public ActionResult Foo(string thing) 
{ 
.... 
} 

L'intention étant de poster à MyController/Foo?thing=yo Maintenant, je ne peux pas lire la charge utile (la longueur est correcte, mais le flux est vide). Je suppose que la plomberie du contrôleur a mangé la charge utile à la recherche de données de poste de formulaire qui peuvent être mappés aux paramètres de la méthode. Est-il possible que je puisse arrêter ce comportement (MVC ne devrait sûrement pas avoir mangé une charge utile dont le type est marqué comme JSON, il devrait seulement regarder les données de formulaire).

public ActionResult Foo(string thing) 
{ 
    Request.InputStream.Position = 0; 
    var reqMemStream = new MemoryStream(HttpContext.Request.BinaryRead(HttpContext.Request.ContentLength)); 
    .... 
} 

Maintenant, cela étant dit, si vous envoyez une charge utile application/json: au JSON mais je ne aime pas vraiment que

Répondre

3

Essayez de réinitialiser la position de flux d'entrée avant la lecture de mon travail autour d'ajouter « chose » pourquoi la Terre sainte vous dérangent à lire directement le flux de demande au lieu de définir simplement et en utilisant un modèle de vue:

public class MyViewModel 
{ 
    public string Thing { get; set; } 
    public string Foo { get; set; } 
    public string Bar { get; set; } 
    ... 
} 

puis:

public ActionResult Foo(MyViewModel model) 
{ 
    // use the model here 
    .... 
} 

ASP.NET MVC 3 dispose d'un JsonValueProviderFactory intégré qui vous permet de lier automatiquement les requêtes JSON aux modèles. Et si vous utilisez une version plus ancienne, il est trivialement facile d'ajouter une usine telle que vous l'illustre Phil Haack dans his blog post.

+2

ty En ce qui concerne votre "pourquoi diable, ...", dans mon cas il n'y a pas de vues ou de modèles. Mes appels sont tous des appels AJAX purs. J'utilise simplement la partie C de MVC comme un cadre sympa pour le côté serveur 'REST'. Aussi le support de microsoft json n'est pas bon pour les types complexes, j'utilise json.net à la place – pm100

+1

Request.InputStream.Position = 0; est une réponse valide. –

Questions connexes