Question 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 point de terminaison depuis une page Web. Il revient toujours 200 OK, mais jQuery exécute l'événement d'erreur. J'ai essayé beaucoup de choses, mais je n'arrivais 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);
}

Code C # 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 ("Record deleted") chaîne après suppression réussie. Je suis capable de 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?


623
2018-05-31 11:17


origine


Réponses:


jQuery.ajax tente de convertir le corps de la réponse en fonction de la spécifié dataType paramètre ou le Content-Type en-tête envoyé par le serveur. Si la conversion échoue (par exemple si 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 au format JSON et renvoie un objet JavaScript. [...]   Les données JSON sont analysées de manière stricte; tout JSON mal formé est   rejeté et une erreur d'analyse est lancée. [...] une réponse vide est aussi   rejeté; le serveur doit renvoyer une réponse null ou {} à la place.

Votre code côté serveur renvoie l'extrait HTML avec 200 OK statut. jQuery attendait JSON valide et déclenche donc le rappel d'erreur se plaignant de parseerror.

La solution est d'enlever le dataType paramètre de votre code jQuery et rendre 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 dans le rappel de succès:

Content-Type: application/json

{"message": "Record deleted"}

933
2018-05-31 11:31



J'ai eu de la chance avec l'utilisation de plusieurs, séparés par des espaces dataTypes (jQuery 1.5+). Un péché:

$.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
});

27
2018-06-15 14:47



Vous devez simplement enlever le dataType: "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
});

24
2017-10-07 03:23



C'est juste pour l'enregistrement depuis que je suis tombé sur ce poste en cherchant une solution à mon problème qui était semblable à l'OP.

Dans mon cas, ma requête jQuery Ajax a été empêchée de réussir en raison de politique de même origine dans Chrome. Tout a été résolu quand j'ai modifié mon serveur (Node.js) pour faire:

response.writeHead(200,
          {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "http://localhost:8080"
        });

Cela m'a littéralement coûté une heure de me cogner la tête contre le mur. Je me sens stupide ...


14
2018-06-29 08:35



Je suppose que votre page aspx ne retourne pas un objet JSON. Votre page devrait faire quelque chose comme ça (page_load)

var jSon = new JavaScriptSerializer();
var OutPut = jSon.Serialize(<your object>);

Response.Write(OutPut);

Aussi, essayez de changer votre AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus devrait vous donner le type d'erreur que vous obtenez.


12
2018-05-31 11:36



J'ai fait face à ce problème avec une bibliothèque jQuery mise à jour. Si la méthode de service ne renvoie rien, cela signifie que le type de retour est void.

Ensuite, dans votre appel Ajax s'il vous plaît mentionner dataType='text'.

Cela résoudra le problème.


10
2018-05-11 02:10



Vous venez de supprimer dataType: 'json' de votre en-tête si votre méthode de service Web implémentée est vide.

Dans ce cas, l'appel Ajax ne s'attend pas à avoir un type de données de retour JSON.


5
2017-11-29 23:56



J'ai eu le même problème. Mon problème était que mon contrôleur renvoyait un code d'état au lieu de JSON. Assurez-vous que votre contrôleur renvoie quelque chose comme:

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}

3
2018-06-25 14:53