La requête Ajax renvoie 200 OK, mais un événement d'erreur est déclenché à la place du succès.
j'ai implémenté une requête Ajax sur mon site web, et j'appelle le terminal à partir d'une page web. Il retourne toujours 200 OK , mais jQuery exécute l'événement d'erreur. J'ai essayé beaucoup de choses, mais je ne pouvais pas comprendre le problème. J'ajoute mon code ci-dessous:
Code jQuery
var row = "1";
var json = "{'TwitterId':'" + row + "'}";
$.ajax({
type: 'POST',
url: 'Jqueryoperation.aspx?Operation=DeleteRow',
contentType: 'application/json; charset=utf-8',
data: json,
dataType: 'json',
cache: false,
success: AjaxSucceeded,
error: AjaxFailed
});
function AjaxSucceeded(result) {
alert("hello");
alert(result.d);
}
function AjaxFailed(result) {
alert("hello1");
alert(result.status + ' ' + result.statusText);
}
C# code pour JqueryOpeartion.aspx
protected void Page_Load(object sender, EventArgs e) {
test();
}
private void test() {
Response.Write("<script language='javascript'>alert('Record Deleted');</script>");
}
j'ai besoin de la chaîne ("Record deleted")
après succès suppression. Je peux supprimer le contenu, mais je ne reçois pas ce message. Est-ce correct Ou Est-ce que je fais quelque chose de mal? Quelle est la bonne façon de résoudre ce problème?
15 réponses
jQuery.ajax
tente de convertir le corps de réponse en fonction du paramètre spécifié dataType
ou de l'en-tête Content-Type
envoyé par le serveur. Si la conversion échoue (par exemple si le JSON/XML n'est pas valide), le rappel d'erreur est déclenché.
votre code AJAX contient:
dataType: "json"
dans ce cas jQuery:
évalue la réponse comme suit: JSON et renvoie un objet JavaScript. […] Les données JSON sont analysées d'une manière stricte; tout JSON malformé est rejeté et une erreur d'analyse est lancée. [...] une réponse vide est également rejetée, le serveur doit renvoyer une réponse de null ou {} à la place.
votre code côté serveur renvoie un extrait HTML avec le statut 200 OK
. jQuery s'attendait à ce que JSON soit valide et renvoie donc l'erreur de rappel en se plaignant de parseerror
.
La solution est de supprimer le paramètre dataType
de votre code jQuery et de faire revenir le code côté serveur:
Content-Type: application/javascript
alert("Record Deleted");
mais je suggère plutôt de retourner une réponse JSON et d'afficher le message à l'intérieur du succès callback:
Content-Type: application/json
{"message": "Record deleted"}
j'ai eu un peu de chance avec l'utilisation multiple, espace séparé dataType
s ( jQuery 1.5+ ). Comme dans:
$.ajax({
type: 'POST',
url: 'Jqueryoperation.aspx?Operation=DeleteRow',
contentType: 'application/json; charset=utf-8',
data: json,
dataType: 'text json',
cache: false,
success: AjaxSucceeded,
error: AjaxFailed
});
il vous suffit de supprimer le type de données : "json " dans votre appel AJAX
$.ajax({
type: 'POST',
url: 'Jqueryoperation.aspx?Operation=DeleteRow',
contentType: 'application/json; charset=utf-8',
data: json,
dataType: 'json', //**** REMOVE THIS LINE ****//
cache: false,
success: AjaxSucceeded,
error: AjaxFailed
});
c'est juste pour le dossier depuis que je suis tombé dans ce post en cherchant une solution à mon problème qui était similaire à L'OP.
dans mon cas, ma demande de jQuery Ajax a été empêchée en raison de Politique de même origine dans Chrome. Tout a été résolu lorsque j'ai modifié mon serveur (noeud.js) à faire:
response.writeHead(200,
{
"Content-Type": "application/json",
"Access-Control-Allow-Origin": "http://localhost:8080"
});
littéralement m'a coûté une heure de cogner ma tête contre le mur. Je me sens stupide...
je pense que votre page aspx ne renvoie pas un objet JSON. Votre page devrait faire quelque chose comme ceci (page_load)
var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);
Response.Write(OutPut);
aussi, essayer de changer votre AjaxFailed:
function AjaxFailed (XMLHttpRequest, textStatus) {
}
textStatus
devrait vous donner le type d'erreur que vous obtenez.
j'ai fait face à ce problème avec une bibliothèque jQuery mise à jour. Si la méthode de service ne retourne rien, cela signifie que le type de retour est void
.
puis dans votre appel Ajax, veuillez mentionner dataType='text'
.
Il va résoudre le problème.
vous n'avez qu'à supprimer dataType: 'json'
de votre en-tête si votre méthode de service web implémentée est nulle.
dans ce cas, L'appel Ajax ne s'attend pas à avoir un type de données de retour JSON.
j'ai eu le même problème. Mon problème était que mon contrôleur retournait un code d'état au lieu de JSON. Assurez-vous que votre controller retourne quelque chose comme:
public JsonResult ActionName(){
// Your code
return Json(new { });
}
une autre chose qui a tout gâché pour moi était d'utiliser localhost
au lieu de 127.0.0.1 ou vice versa. Apparemment, JavaScript ne peut pas traiter les requêtes de l'un à l'autre.
utilisez le code suivant pour vous assurer que la réponse est dans le format JSON (version PHP)...
header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
j'ai eu le même problème. C'était parce que ma réponse JSON contenait des caractères spéciaux et que le fichier du serveur n'était pas encodé avec UTF-8, donc L'appel Ajax a considéré qu'il ne s'agissait pas d'une réponse JSON valide.
j'ai le même problème mais quand j'ai essayé d'enlever le datatype:'json' J'ai toujours le problème. Mon erreur est l'exécution au lieu du succès
function cmd(){
var data = JSON.stringify(display1());
$.ajax({
type: 'POST',
url: '/cmd',
contentType:'application/json; charset=utf-8',
//dataType:"json",
data: data,
success: function(res){
console.log('Success in running run_id ajax')
//$.ajax({
// type: "GET",
// url: "/runid",
// contentType:"application/json; charset=utf-8",
// dataType:"json",
// data: data,
// success:function display_runid(){}
// });
},
error: function(req, err){ console.log('my message: ' + err); }
});
}
votre script demande un retour dans le type de données JSON.
essayez ceci:
private string test() {
JavaScriptSerializer js = new JavaScriptSerializer();
return js.Serialize("hello world");
}
Essayez de suivre
$.ajax({
type: 'POST',
url: 'Jqueryoperation.aspx?Operation=DeleteRow',
contentType: 'application/json; charset=utf-8',
data: { "Operation" : "DeleteRow",
"TwitterId" : 1 },
dataType: 'json',
cache: false,
success: AjaxSucceeded,
error: AjaxFailed
});
ou
$.ajax({
type: 'POST',
url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1',
contentType: 'application/json; charset=utf-8',
dataType: 'json',
cache: false,
success: AjaxSucceeded,
error: AjaxFailed
});
utilisez des guillemets doubles au lieu de guillemets simples dans l'objet JSON. Je pense que cela va résoudre le problème.