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对象中使用双引号而不是单引号。 我认为这将解决这个问题。