Dans MVC, pourquoi le retour de Content
échoue-t-il parfois dans le rappel Ajax, alors que le retour de Json fonctionne, même pour les objets chaîne simples?
Même en cas d'échec, les données sont toujours disponibles si vous deviez y accéder dans le toujours rappel ...
Lorsque j'ai défini le contentType dans l'appel ajax sur text/xml
la réponse n'entrera plus dans le message d'erreur.
$.ajax({
cache: false,
type: "GET",
contentType: "application/json; charset=utf-8",
dataType: 'json',
url: "/MyController/GetFooString",
data: { },
success: function (data) {
alert(data);
},
error: function (xhr, ajaxOptions, thrownError) {
alert("Ajax Failed!!!");
}
}); // end ajax call
Même en cas d'échec, les données sont toujours disponibles.
public ActionResult GetFooString()
{
String Foo = "This is my foo string.";
return Content(Foo);
} // end GetFooString
public ActionResult GetFooString()
{
String Foo = "This is my foo string.";
return Json(Foo, JsonRequestBehavior.AllowGet);
} // end GetFooString
L'utilisation de Content(Foo);
envoie une réponse qui n'a pas l'en-tête de type mime. Cela se produit car vous ne définissez pas ContentType
lorsque vous utilisez cette surcharge. Lorsque le Content-Type n'est pas défini, jQuery essaiera de deviner le type de contenu. Lorsque cela se produit, le fait qu'il puisse réussir à deviner ou non dépend du contenu réel et du navigateur sous-jacent. Voir ici :
dataType (par défaut: Intelligent Guess (xml, json, script ou html))
Json(...)
d'autre part explicitement définit le type de contenu sur "application/json"
afin que jQuery sache exactement comment traiter le contenu.
Vous pouvez obtenir un résultat cohérent à partir de Content
si vous utilisez 2ème surcharge et spécifiez un ContentType:
return Content(Foo, "application/json"); // or "application/xml" if you're sending XML
Mais si vous traitez toujours avec JSON, préférez utiliser JsonResult
return Json(Foo, JsonRequestBehavior.AllowGet);