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?

647
demandé sur K48 2011-05-31 15:17:38

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"}
957
répondu Salman A 2018-07-18 14:26:23

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
});
28
répondu jaketrent 2017-02-25 10:13:53

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
});
24
répondu Philippe Genois 2016-10-07 03:23:49

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...

14
répondu Corvin 2017-02-25 10:23:34

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.

12
répondu LeftyX 2018-05-09 07:28:13

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.

11
répondu Suresh Vadlakonda 2017-02-25 10:31:58

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.

5
répondu Bilel omrani 2017-02-25 10:18:38

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 { });
}
3
répondu Alexander Suleymanov 2017-02-25 10:20:25

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.

1
répondu Paul 2017-02-25 10:17:37

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;
1
répondu Terry Lin 2017-02-25 10:19:42

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.

0
répondu Mehdi Izcool 2017-02-25 10:31:19

voir ce . C'est aussi le même problème. De travail que j'ai essayé.

Ne pas supprimer dataType: 'JSON',

Remarque: echo seulement JSON Formiate dans le fichier PHP si vous utilisez php echo votre code ajax retour 200

0
répondu Inderjeet 2018-05-03 11:48:30

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); }
    });
}
0
répondu Rakesh Kumar 2018-06-09 01:08:18

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");
}
-1
répondu Kashif Faraz 2018-04-21 05:10:01

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.

-10
répondu Salman Riaz 2011-05-31 11:39:58