J'avais eu une "analyse syntaxique" de jQuery pour une requête Ajax, j'ai essayé de changer le POST en GET, en retournant les données de différentes manières (création de classes, etc.) mais je ne peux pas comprendre. quel est le problème.
Mon projet est dans 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 "Vues" de la liste dans le Viewbag et déclencher 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 renvoie:
[{"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 error pour la méthode $ .ajax () en disant "parsererror".
J'ai récemment rencontré ce problème et suis tombé sur cette question.
Je l'ai résolu avec un moyen beaucoup plus facile.
Méthode 1
Vous pouvez soit supprimer la propriété dataType: 'json'
du littéral d'objet ...
Méthode deux
Vous pouvez également faire ce que @Sagiv disait en renvoyant vos données sous la forme Json
.
La raison pour laquelle ce message parsererror
se produit est que, lorsque vous renvoyez simplement une chaîne ou une autre valeur, il ne s'agit pas vraiment de Json
. L'analyseur échoue donc lors de son analyse.
Donc, si vous supprimez la propriété dataType: json
, elle ne tentera pas de l'analyser sous la forme Json
.
Avec l’autre méthode, si vous vous assurez de renvoyer vos données sous la forme Json
, l’analyseur saura comment les gérer correctement.
Voir le réponse par @ david-east pour connaître la bonne façon de traiter le problème
Cette réponse concerne uniquement un bug avec jQuery 1.5 lors de l'utilisation du fichier: protocole.
J'ai eu un problème similaire récemment lors de la mise à niveau vers jQuery 1.5. Malgré l'obtention d'une réponse correcte, le gestionnaire d'erreurs s'est déclenché. Je l'ai résolu en utilisant l'événement complete
puis en vérifiant la valeur du statut. par exemple:
complete: function (xhr, status) {
if (status === 'error' || !xhr.responseText) {
handleError();
}
else {
var data = xhr.responseText;
//...
}
}
Vous avez spécifié la réponse à l'appel ajax dataType sous la forme:
'json'
où la réponse ajax réelle n’est pas un JSON valide et l’analyseur JSON génère donc une erreur.
La meilleure approche que je recommanderais est de changer le dataType en:
'texte'
et, dans le rappel de réussite, validez si un JSON valide est renvoyé ou non, et si la validation JSON échoue, alertez-le à l'écran de manière à ce que l'appel ajax échoue. Regardez ça:
$.ajax({
url: '/Admin/Ajax/GetViewContentNames',
type: 'POST',
dataType: 'text',
data: {viewID: $("#view").val()},
success: function (data) {
try {
var output = JSON.parse(data);
alert(output);
} catch (e) {
alert("Output is not valid JSON: " + data);
}
}, error: function (request, error) {
alert("AJAX Call Error: " + error);
}
});
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 devrait avoir Json en retour. essayez de retourner JsonResult dans le contrôleur comme ça:
public JsonResult YourAction()
{
...return Json(YourReturnObject);
}
j'espère que ça aide :)
Vos données JSON peuvent être fausses. http://jsonformatter.curiousconcept.com/ pour le valider.
Il y a beaucoup de suggestions pour supprimer
dataType: "json"
Bien que j'avoue que cela fonctionne, c'est ignorer le problème sous-jacent. Si vous êtes sûr que la chaîne de retour est réellement JSON, recherchez les blancs errants au début de la réponse. Pensez à y jeter un coup d'oeil dans violoneux. Le mien ressemblait à ceci:
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
{"type":"scan","data":{"image":".\/output\/ou...
Dans mon cas, il s'agissait d'un problème avec PHP qui crachait des caractères indésirables (dans ce cas, les nomenclatures de fichiers UTF). Une fois que j'ai enlevé ceux-ci il a résolu le problème tout en gardant
dataType: json
Assurez-vous de supprimer tout code de débogage ou tout autre élément susceptible de générer des informations inattendues. Un peu évident, mais facile à oublier dans l'instant.
return Json(data,JsonRequestBehavior.AllowGet);
Je recevais aussi "Demande de retour avec erreur: parsererror." dans la console javascript. Dans mon cas, ce n’était pas une affaire de Json, mais je devais transmettre à la zone de texte de la vue un codage valide.
String encodedString = getEncodedString(text, encoding);
view.setTextAreaContent(encodedString);
vous devez supprimer le type de données: "json". Ensuite, voyez la magie ... la raison en est que vous convertissez un objet json en chaîne simple .. si bien que l'analyseur json n'est pas en mesure d'analyser cette chaîne car il n'est pas un objet json.
this.LoadViewContentNames = function () {
$.ajax({
url: '/Admin/Ajax/GetViewContentNames',
type: 'POST',
data: { viewID: $("#view").val() },
success: function (data) {
alert(data);
},
error: function (data) {
debugger;
alert("Error");
}
});
};
J'ai eu le même problème, il s'est avéré que mon web.config
n'était pas le même avec mes coéquipiers. Veuillez donc vérifier votre web.config
.
J'espère que ça aide quelqu'un.
Je ne sais pas si c'est toujours d'actualité, mais le problème était avec l'encodage. Le passage à ANSI a résolu le problème pour moi.
J'ai rencontré une telle erreur, mais après avoir modifié ma réponse avant de l'envoyer au client, cela a bien fonctionné.
//Server side
response = JSON.stringify('{"status": {"code": 200},"result": '+ JSON.stringify(result)+'}');
res.send(response); // Sending to client
//Client side
success: function(res, status) {
response = JSON.parse(res); // Getting as expected
//Do something
}
Si vous rencontrez ce problème en utilisant HTTP GET dans IE j'ai résolu ce problème en définissant le cache: false. Comme j'ai utilisé la même URL pour les requêtes HTML et JSON, elle a frappé le cache au lieu de faire un appel json.
$.ajax({
url: '/Test/Something/',
type: 'GET',
dataType: 'json',
cache: false,
data: { viewID: $("#view").val() },
success: function (data) {
alert(data);
},
error: function (data) {
debugger;
alert("Error");
}
});