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

问题描述 投票:0回答:14

我已经在我的网站上实现了 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);
}

JqueryOpeartion.aspx

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

我需要成功删除后的

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

javascript jquery asp.net ajax json
14个回答
1251
投票

jQuery.ajax
尝试根据指定的
dataType
参数或服务器发送的
Content-Type
标头转换响应正文。如果转换失败(例如,如果 JSON/XML 无效),则会触发错误回调。


您的 AJAX 代码包含:

dataType: "json"

在本例中 jQuery:

将响应评估为 JSON 并返回 JavaScript 对象。 […] JSON数据经过严格解析;任何格式错误的 JSON 都是 被拒绝并抛出解析错误。 [...] 空响应也是 拒绝;服务器应该返回 null 或 {} 响应。

您的服务器端代码返回带有

200 OK
状态的 HTML 片段。 jQuery 期望有效的 JSON,因此触发错误回调,抱怨
parseerror

解决方案是从 jQuery 代码中删除

dataType
参数并使服务器端代码返回:

Content-Type: application/javascript

alert("Record Deleted");

但我宁愿建议返回 JSON 响应并在成功回调中显示消息:

Content-Type: application/json

{"message": "Record deleted"}

46
投票

您只需在 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
});

37
投票

我在使用多个空格分隔的

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

24
投票

这只是为了记录,因为我在寻找与OP类似的问题解决方案时遇到了这篇文章。

就我而言,由于 Chrome 中的同源策略,我的 jQuery Ajax 请求无法成功。当我修改我的服务器(Node.js)来执行以下操作时,所有问题都得到了解决:

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

这确实让我花了一个小时把头撞在墙上。我感觉自己很蠢...


15
投票

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

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

Response.Write(OutPut);

另外,尝试更改你的 AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus
应该会告诉您所遇到的错误类型。


13
投票

我在更新 jQuery 库时遇到了这个问题。如果服务方法没有返回任何内容,则意味着返回类型为

void

然后在您的 Ajax 通话中请提及

dataType='text'

它将解决问题。


8
投票

如果您实现的 Web 服务方法无效,您只需从标头中删除

dataType: 'json'

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


7
投票

看这个。这也是一个类似的问题。我尝试过工作。

请勿删除

dataType: 'JSON',

注意:您的响应数据应为json格式


5
投票

使用以下代码确保响应为 JSON 格式(PHP 版本)...

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

4
投票

我也有同样的问题。我的问题是我的控制器返回状态代码而不是 JSON。确保您的控制器返回类似以下内容:

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

2
投票

另一件让我搞砸的事情是使用

localhost
而不是 127.0.0.1,反之亦然。显然,JavaScript 无法处理从一个到另一个的请求。


2
投票

如果您始终从服务器返回 JSON(没有空响应),则

dataType: 'json'
应该可以工作,并且不需要
contentType
。但是请确保 JSON 输出...

jQuery AJAX 会对有效但未序列化的 JSON 抛出“解析错误”!


1
投票

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


-1
投票

您的脚本要求返回 JSON 数据类型。

试试这个:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}
© www.soinside.com 2019 - 2024. All rights reserved.