web-dev-qa-db-fra.com

MVC Controller Return Content vs Return Json Ajax

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

Mettre à jour:

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:

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

Action du contrôleur qui échoue (parfois)

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

Action du contrôleur qui fonctionne toujours

public ActionResult GetFooString()
{
    String Foo = "This is my foo string.";
    return Json(Foo, JsonRequestBehavior.AllowGet);
} // end GetFooString
10
silencedmessage

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); 
16
Mrchief