Ajax请求返回200 OK,但会触发错误事件而不是成功

我在我的网站上实现了一个Ajax请求,我正在从一个网页调用端点。 它总是返回200 OK ,但jQuery执行错误事件。 我尝试了很多东西,但我无法弄清楚这个问题。 我在下面添加我的代码:

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#代码为JqueryOpeartion.aspx

 protected void Page_Load(object sender, EventArgs e) { test(); } private void test() { Response.Write("<script language='javascript'>alert('Record Deleted');</script>"); } 

成功删除后,我需要("Record deleted")字符串。 我可以删除内容,但我没有收到此消息。 这是正确的还是我做错了什么? 什么是解决这个问题的正确方法?

您的Ajax请求包含以下设置:

 dataType: "json" 

该文档指出,jQuery:

将响应评估为JSON并返回一个JavaScript对象。 (…)JSON数据严格分析; 任何格式不正确的JSON都会被拒绝,并引发解析错误。

这意味着如果服务器以200 OK状态返回无效的JSON,则jQuery将触发错误函数并将textStatus参数设置为"parsererror"

解决方案:确保服务器返回有效的 JSON。 值得注意的是,一个空的响应也被认为是无效的JSON; 你可以返回{}null ,例如验证为JSON。

您可以在jsonlint.com上检查JSON是否有效。

我使用了多个空格分隔的dataType ( jQuery 1.5+ )。 如:

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

你只需要在你的AJAX调用中删除dataType:“json”

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

这只是为了记录,因为我碰到这个帖子时寻找解决我的问题是类似的OP。

在我的情况下,由于Chrome中的同源策略 ,我的jQuery Ajax请求被阻止成功。 当我修改我的服务器(Node.js)时,所有的问题都解决了:

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

这实际上花了我一个小时的头撞墙。 我感觉很蠢

我认为你的aspx页面不返回一个JSON对象。 你的页面应该做这样的事情(page_load)

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

另外,请尝试更改您的AjaxFailed:

 function AjaxFailed (XMLHttpRequest, textStatus) { } 

textStatus应该给你错误的类型。

如果实现的Web服务方法是无效的,那么只需从头中删除dataType: 'json'

在这种情况下,Ajax调用不期望有一个JSON返回数据类型。

我遇到过同样的问题。 我的问题是我的控制器返回一个状态代码,而不是JSON。 确保你的控制器返回类似于:

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

我遇到了这个问题与更新的jQuery库。 如果服务方法没有返回任何东西,这意味着返回类型是void

然后在你的Ajax调用中,请提及dataType='text'

这将解决问题。

另一件让我感到困惑的事情是使用localhost而不是127.0.0.1,反之亦然。 显然,JavaScript不能处理从一个到另一个的请求。

使用下面的代码来确保响应是JSON格式(PHP版本)…

 header('Content-Type: application/json'); echo json_encode($return_vars); exit; 

我有同样的问题。 这是因为我的JSON响应包含一些特殊字符,并且服务器文件未使用UTF-8编码,所以Ajax调用认为这不是有效的JSON响应。

尝试以下

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

要么

 $.ajax({ type: 'POST', url: 'Jqueryoperation.aspx?Operation=DeleteRow&TwitterId=1', contentType: 'application/json; charset=utf-8', dataType: 'json', cache: false, success: AjaxSucceeded, error: AjaxFailed }); 

在JSON对象中使用双引号而不是单引号。 我认为这将解决这个问题。