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

Ajax request returns 200 OK, but an error event is fired instead of success

提问人:Pankaj Mishra 提问时间:5/31/2011 最后编辑:Arsen KhachaturyanPankaj Mishra 更新时间:3/19/2021 访问量:451620

问:

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

JavaScript jQuery asp.net AJAX JSON

评论

3赞 parapura rajkumar 5/31/2011
您能否通过 JSON 验证器运行 JqueryOperation.aspx 的输出并查看它是否有效 JSON
2赞 Felix Kling 5/31/2011
就像 jsonlint.com.您还必须检查您发送的参数。目前,您尚未设置任何参数名称。如果参数是 ,则必须将对象传递给 ,而不是字符串: 。TwitterIddatadata: {TwitterId: row}
10赞 Salman A 5/31/2011
Jqueryoperation.aspx 页面是否返回(有效)JSON?
1赞 Raghav 5/31/2011
可能您的服务器端代码抛出异常.您在 catch 块中返回什么作为响应?
3赞 StuperUser 5/31/2011
@Raghav,如果服务器在处理请求时抛出异常,则 HTTP 返回码将为 500。

答:

1251赞 Salman A 5/31/2011 #1

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


您的 AJAX 代码包含:

dataType: "json"

在本例中为 jQuery:

以 JSON 形式评估响应并返回 JavaScript 对象。[...] JSON数据以严格的方式解析;任何格式不正确的 JSON 都是 被拒绝,并引发解析错误。[...]空响应也是 拒绝;服务器应返回 null 或 {} 的响应。

服务器端代码返回带有状态的 HTML 代码段。jQuery需要有效的JSON,因此会触发错误回调,抱怨。200 OKparseerror

解决方案是从 jQuery 代码中删除参数,并使服务器端代码返回:dataType

Content-Type: application/javascript

alert("Record Deleted");

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

Content-Type: application/json

{"message": "Record deleted"}
15赞 LeftyX 5/31/2011 #2

我估计您的 aspx 页面没有返回 JSON 对象。 你的页面应该做这样的事情(page_load)

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

Response.Write(OutPut);

另外,尝试更改 AjaxFailed:

function AjaxFailed (XMLHttpRequest, textStatus) {

}

textStatus应该给你你得到的错误类型。

37赞 jaketrent 6/15/2011 #3

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

$.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
});
2赞 Paul 1/30/2014 #4

另一件对我来说搞砸的事情是使用 127.0.0.1 而不是 127.0.0.1,反之亦然。显然,JavaScript 无法处理从一个到另一个的请求。localhost

8赞 Bilel omrani 11/30/2014 #5

如果实现的 Web 服务方法无效,则只需从标头中删除即可。dataType: 'json'

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

5赞 Terry Lin 5/11/2015 #6

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

header('Content-Type: application/json');
echo json_encode($return_vars);
exit;
4赞 Alexander Suleymanov 6/25/2015 #7

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

public JsonResult ActionName(){
   // Your code
   return Json(new { });
}
24赞 Corvin 6/29/2015 #8

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

就我而言,由于Chrome中的同源策略,我的jQuery Ajax请求无法成功。当我修改我的服务器(Node.js)时,一切都解决了:

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

从字面上看,我花了一个小时把头撞在墙上。我感觉很傻......

1赞 Mehdi Izcool 3/23/2016 #9

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

13赞 Suresh Vadlakonda 5/11/2016 #10

我在更新的jQuery库中遇到了这个问题。如果服务方法未返回任何内容,则表示返回类型为 。void

那么在您的 Ajax 通话中,请提及 .dataType='text'

它将解决问题。

46赞 Philippe Genois 10/7/2016 #11

您只需在 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
});
-1赞 Kashif Faraz 4/21/2018 #12

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

试试这个:

private string test() {
  JavaScriptSerializer js = new JavaScriptSerializer();
 return js.Serialize("hello world");
}
7赞 Inderjeet 5/1/2018 #13

看这个。这也是一个类似的问题。我试过了。

不要删除dataType: 'JSON',

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

评论

0赞 89n3ur0n 7/30/2023
粗体中提到的内容是重要的响应必须有正文,感谢您节省时间。
2赞 Fabian von Ellerts 10/15/2018 #14

如果您总是从服务器返回 JSON(没有空响应),则应该有效且不需要。但是,请确保 JSON 输出...dataType: 'json'contentType

jQuery AJAX 将在有效但未序列化的 JSON 上抛出“parseerror”!