jQuery post JSON échoue au moment de retourner la valeur null à partir de ASP.NET MVC
- Je utiliser ASP.NET MVC de post JSON à partir de jQuery, et obtenir quelques JSON en arrière, à l'aide de cette petite bibliothèque de fonction:
(function($) {
$.postJson = function(url, data) {
return $.ajax({
url: url,
data: JSON.stringify(data),
type: 'POST',
dataType: 'json',
contentType: 'application/json; charset=utf-8'
});
};
})(jQuery);
Alors, évidemment, je vais appeler ça comme:
$('#button').click(function() {
$.postJson('/controller/action', { Prop1: 'hi', Prop2: 'bye' })
.done(function(r) { alert('It worked.'); })
.fail(function(x) { alert('Fail! ' + x.status); });
});
ASP.NET MVC 3 et ASP.NET MVC 4 soutenir les soumettre côté des choses (avant que vous avez besoin pour étendre ASP.NET MVC pour gérer la soumission JSON), mais le problème je suis en cours d'exécution est sur le retour. Sur le Contrôleur, j'ai souvent de retourner la valeur null à dire "le Succès, rien d'autre à dire," comme:
[HttpPost]
public JsonResult DoSomething(string Prop1, string Prop2)
{
if (doSomething(Prop1, Prop2)
return Json(null); //Success
return Json(new { Message = "It didn't work for the following reasons" });
}
- Je utiliser ce modèle fréquemment et il fonctionne très bien - à mon succès/fait de rappel est appelée, et tout est bien. Mais récemment, j'ai mis à jour ASP.NET MVC et jQuery, et il a arrêté de travailler à la place de mon échec de callback est appelé à chaque fois que je return Json(null);
. Par ailleurs, j'ai inspecté la réponse et la statusCode se retourné est en fait 200, de sorte que le serveur n'est pas à défaut d' - jQuery est juste de dire qu'il est.
$(document).ajaxError...
montre dans exception.message
: "fin Inattendue d'entrée" quand Json(null)
est de retour (pour ne citer qu'elle, elle ne m'aide pas à trouver la raison du problème).OriginalL'auteur Chris Moschini | 2013-04-11
Vous devez vous connecter pour publier un commentaire.
Le problème a été causé par la mise à niveau de jQuery 1.8 à 1.9. En jQuery 1.7 et 1.8, cette MVC:
a été accepté comme valable JSON et interprétée comme null. Techniquement, cela envoie une chaîne vide vers le client, avec HTTP 200, et c'est assez bon pour jQuery <1.9.
Mais maintenant nous sommes en utilisant jQuery 1.9.1), il tente d'analyser la chaîne vide comme JSON, jQuery, JSON analyseur déclenche une exception sur la chaîne vide, et qui déclenche un code de la chaîne qui se termine par un
fail()
rappel de la place.Une solution de contournement est d'au lieu de passer ce depuis le serveur sur le succès avec aucune autre information:
Qui passe de rassemblement avec jQuery JSON d'analyseur et tout est bien. Cela fonctionne aussi:
Mise à jour
Musa notes en dessous de ce comportement par MVC semble cassé. Cette séparé de Débordement de Pile de répondre à à l'Aide de JSON.NET comme la valeur par défaut JSON sérialiseur ASP.NET MVC 3 - est-il possible? traite de la façon d'obtenir MVC pour retourner la valeur null pour
Json(null)
- fondamentalement, l'utilisation Json.NET au lieu de ASP.NET MVC est intégré dans sérialiseur JSON. C'est la solution que j'ai fini de l'utiliser.Vous devez utiliser une version légèrement modifiée de cette réponse pour résoudre ce cependant de code est ci-dessous. En gros, ne pas inclure la
if
déclaration de vérification pour null avant de passer à sérialiser, ou vous êtes de retour dans la même situation.Mise à jour 2
Le défaut de mise en œuvre de la norme ISO 8601 Dates Json.NET les pauses Internet Explorer 9 et ci-dessous lorsqu'il tente de l'analyser avec
new Date(...)
. En d'autres termes, ces analyser correctement dans Internet Explorer 9:Mais cela déclenche une exception:
Internet Explorer 9 Date() de la mise en œuvre ne peut pas faire face à tout, mais exactement trois milliseconde lieux. Pour y remédier, vous devez remplacer la Json.NET format de date à la force. Inclus dans le code ci-dessous.
Un Résumé qui montre comment faire le lien dans un BaseController:
https://gist.github.com/b9chris/6991b341e89bb0a4e6d801d02dfd7730
return Json(null);
de retourner une chaîne vide sons cassés, il doit retournernull
Probablement, bien qu'à ce stade, cela pourrait également être une modification de rupture - je suis allé à creuser, et il semble qu'il a retourné une chaîne vide pour les nuls depuis le début des jours de la MVC. Je suis d'accord que peut-être une meilleure solution à ce problème. Cette réponse couvre le faire, bien que l'exemple de code vérifie la valeur null et renvoie une chaîne vide avant Json.Net pouvez obtenir un coup de feu au - supprimer les 2 lignes et vous obtiendrez la valeur null est retourné non modifiée. stackoverflow.com/a/7150912/176877
OriginalL'auteur