2016-03-29 1 views
3

J'ai créé un projet web api par défaut avec au moins ces deux formateurs de médias chargés. Les deux sont pour le même type de contenu:FormUrlEncodedMediaTypeFormatter vs JQueryMvcFormUrlEncodedFormatter

FormUrlEncodedMediaTypeFormatter: application/x-www-form-urlencoded 
JQueryMvcFormUrlEncodedFormatter: application/x-www-form-urlencoded 

Quand je fais un simple formulaire post http avec enctype="application/x-www-form-urlencoded" il ne fonctionne qu'avec le JQueryMvcFormUrlEncodedFormatter, cela signifie que mon objet complexe envoyé est non nul à côté serveur.

Lorsque je supprime le formateur JQueryMvcFormUrlEncodedFormatter au démarrage de l'application et que je répète le simple formulaire http, je m'attends à ce qu'il fonctionne à nouveau, mais ce n'est pas le cas.

Je reçois une exception qu'aucun formateur approprié n'est chargé.

Cest pas vrai -actually-

Pourquoi ça ne marche pas?

P.S.

Je trouve que c'est la différence:

– System.Net.Http.Formatting.FormUrlEncodedMediaTypeFormatter, for handling HTML form URL-encoded data 
– System.Web.Http.ModelBinding.JQueryMvcFormUrlEncodedFormatter, for handling model-bound HTML form URL-encoded data 

mais je ne comprends pas la différence!

je ne l'utilise même pas jquery pour poster ma forme:

<form role="form" method="post" action="api/values" enctype="application/x-www-form-urlencoded"> 
    <input type="text" class="form-control" name="firstName" placeholder="Enter first name"> 
    <input type="text" class="form-control" name="lastName" placeholder="Enter last name"> 
    <button type="submit" class="btn btn-default">Submit</button> 
</form> 
+0

Il y a un ordre de précédence, il prend toujours le premier encodeur dans la liste.Les deux encodeurs, Jquery et le formulaire peuvent gérer le même type de demande. – Fals

+0

J'ai écrit que j'ai supprimé le formateur jquery et que le formateur restant ne fonctionnait pas. Donc ce que vous dites est faux ou j'ai fait quelque chose de mal. – Pascal

+0

Mon erreur! Regardez l'espace de noms complet de ces deux: Formatage et ModelBinding. Tout dans l'espace de noms Mise en forme est responsable de la sérialisation et de la désérialisation du message HTML pour le type demandé. ModelBinding, plus précisément JQueryMvcFormUrlEncodedFormatter, est une requête MediaTypeFormatting pour l'application/x-www-form-urlencoded. – Fals

Répondre

2

FormUrlEncodedMediaTypeFormatter se fixe application/x-www-form-urlencoded corps type FormDataCollection, et seulement ce type. Cependant, il utilise les ModelBinders disponibles pour d'abord analyser le corps en FormDataCollection, puis utiliser le premier ModelBinder compatible pour l'analyser dans le modèle final. C'est comme mélanger l'approche Model Binding et l'approche Media Type Formatting, ce qui n'est AFAIK expliqué nulle part dans les documents WebAPI.

Les deux formateurs sont enregistrés par défaut. C'est ce que j'ai déduit de la lecture du code source WebAPI.

2

Il y a 4 hors de la boîte formatteurs

  • JsonMediaTypeFormatter
  • XMLMediaTypeFormatter
  • FormUrlEncodedMediaTypeFormatter
  • JQueryMvcFormUrlEncodedFormatter

    Les deux premiers types médias formatteurs peuvent sérialiser et désérialiser types CLR pour demander/réponse et vice versa. Mais le 3e ne sérialise ni ne désérialise aucun type de CLR. Le 4ème formateur peut désérialiser les données brutes entrantes en type CLR.

    Par conséquent dans votre cas, vous rencontrez une erreur après avoir supprimé JQueryMvcFormUrlEncodedFormatter car le 3ème formateur n'a pas pu désérialiser les données de demande entrantes au type CLR.