225 votes

jQuery renvoie "parsererror" pour une requête ajax

J'ai obtenu un "parsererror" de jquery pour une requête Ajax, j'ai essayé de changer le POST en GET, de retourner les données de différentes manières (en créant des classes, etc.) mais je n'arrive pas à comprendre quel est le problème.

Mon projet est en MVC3 et j'utilise jQuery 1.5. J'ai une liste déroulante et, lors de l'événement onchange, je lance un appel pour obtenir des données en fonction de ce qui a été sélectionné.

Dropdown : (cela charge les "Views" à partir de la liste dans le Viewbag et le déclenchement de l'événement fonctionne bien)

@{
    var viewHtmls = new Dictionary<string, object>();
    viewHtmls.Add("data-bind", "value: ViewID");
    viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()");
}
@Html.DropDownList("view", (List<SelectListItem>)ViewBag.Views, viewHtmls)

Javascript :

this.LoadViewContentNames = function () {
    $.ajax({
        url: '/Admin/Ajax/GetViewContentNames',
        type: 'POST',
        dataType: 'json',
        data: { viewID: $("#view").val() },
        success: function (data) {
            alert(data);
        },
        error: function (data) {
            debugger;
            alert("Error");
        }
    });
};

Le code ci-dessus appelle avec succès la méthode MVC et retourne :

[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
 {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]

Mais jquery déclenche l'événement d'erreur pour la méthode $.ajax() en disant "parsererror".

0 votes

Est-ce qu'une erreur javascript s'affiche dans la console ou est-ce que la fonction de gestion "error" de la commande $.ajax() est exécutée ?

0 votes

Désolé, j'aurais dû être plus précis, il déclenche la fonction d'erreur $.ajax() { alert("Error") ; }

0 votes

Une chance d'avoir un lien en direct ? Voyez-vous les données JSON que vous affichez dans Firebug ?

379voto

David Points 4305

J'ai récemment rencontré ce problème et je suis tombé sur cette question.

J'ai résolu le problème avec une méthode beaucoup plus simple.

Première méthode

Vous pouvez soit retirer le dataType: 'json' de la propriété de l'objet littéral...

Deuxième méthode

Ou vous pouvez faire ce que @Sagiv disait en retournant vos données comme Json .


La raison pour laquelle cette parsererror Le message se produit lorsque l'on renvoie simplement une chaîne de caractères ou une autre valeur. Json L'analyseur syntaxique échoue donc lors de son analyse.

Donc si vous retirez le dataType: json il n'essaiera pas de l'analyser en tant que propriété Json .

Avec l'autre méthode, si vous vous assurez de retourner vos données en tant que Json l'analyseur syntaxique saura comment le traiter correctement.

6 votes

Merci David, la première méthode a fonctionné pour moi. Dans mon cas, je ne retournais rien, mais j'ai utilisé un type de données par erreur. Merci pour l'astuce.

0 votes

Merci pour la réponse, j'ai mis à jour la réponse à la quête car cela semble être une meilleure solution.

0 votes

J'ai rencontré ce problème lorsque mon script php script avait une erreur, et renvoyait des données non-JSON - une suggestion utile à désactiver. dataType en effet !

30voto

johnhunter Points 1134

Voir le réponse par @david-east pour la manière correcte de traiter le problème

Cette réponse n'est pertinente que pour un bug avec jQuery 1.5 lors de l'utilisation du protocole file :.

J'ai eu un problème similaire récemment lors de la mise à jour vers jQuery 1.5. Malgré une réponse correcte, le gestionnaire d'erreurs se déclenchait. J'ai résolu le problème en utilisant l'option complete puis en vérifiant la valeur de l'état, par ex :

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}

0 votes

Pas de ticket sur ce point. J'ai créé un scénario de test et je ne peux que répéter l'erreur en cas d'accès avec le protocole file :. Il ne s'agit donc pas du même problème.

0 votes

Ok, donc ça a plus ou moins marché. J'ai dû utiliser un eval pour remapper le responseText en un objet Json. Il semble juste étrange que jQuery ne fonctionne pas pour analyser la réponse...

0 votes

@d1k_is content que ça ait aidé. Le fait de devoir évaluer le texte de la réponse est un problème :( J'ai déposé une demande de modification de la réponse. billet sur ce point avec JQuery. Il s'est avéré qu'il a été corrigé et sera dans la version 1.5.1. Cela peut aussi concerner votre problème.

12voto

sagivo Points 4759

Le problème est que votre contrôleur renvoie une chaîne ou un autre objet qui ne peut pas être analysé. L'appel ajax s'attend à recevoir Json en retour. Essayez de retourner JsonResult dans le contrôleur comme ça :

 public JsonResult YourAction()
    {
        ...return Json(YourReturnObject);

    }

J'espère que cela vous aidera :)

0 votes

Désolé, j'ai oublié d'inclure mon codebehind, mais c'est exactement comme ça que le Json est retourné.

5voto

Vishal Sakaria Points 167

Vos données JSON sont peut-être fausses. http://jsonformatter.curiousconcept.com/ pour le valider.

2voto

Jahmic Points 1878

Assurez-vous de supprimer tout code de débogage ou tout autre élément susceptible de fournir des informations non souhaitées. C'est assez évident, mais facile à oublier sur le moment.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X