一直从jquery获得一个Ajax请求的“parsererror”,我已经尝试将POST更改为GET,以几种不同的方式返回数据(创建类等),但我似乎无法找出问题是什么。

我的项目是在MVC3和我使用jQuery 1.5 我有一个下拉菜单,在onchange事件上,我触发了一个调用,以获得基于所选内容的一些数据。

下拉菜单:(这将从Viewbag中的列表中加载“Views”,并触发事件工作正常)

@{
    var viewHtmls = new Dictionary<string, object>();
    viewHtmls.Add("data-bind", "value: ViewID");
    viewHtmls.Add("onchange", "javascript:PageModel.LoadViewContentNames()");
}
@Html.DropDownList("view", (List<SelectListItem>)ViewBag.Views, viewHtmls)

Javascript:

this.LoadViewContentNames = function () {
    $.ajax({
        url: '/Admin/Ajax/GetViewContentNames',
        type: 'POST',
        dataType: 'json',
        data: { viewID: $("#view").val() },
        success: function (data) {
            alert(data);
        },
        error: function (data) {
            debugger;
            alert("Error");
        }
    });
};

上面的代码成功调用MVC方法并返回:

[{"ViewContentID":1,"Name":"TopContent","Note":"Content on the top"},
 {"ViewContentID":2,"Name":"BottomContent","Note":"Content on the bottom"}]

但是jquery会触发$.ajax()方法的错误事件,表示“parsererror”。


当前回答

我也遇到了同样的问题。我发现解决我的问题的方法是确保使用双引号而不是单引号。

echo "{'error':'Sorry, your file is too large. (Keep it under 2MB)'}";
-to-
echo '{"error":"Sorry, your file is too large. (Keep it under 2MB)"}';

其他回答

我最近遇到了这个问题,偶然发现了这个问题。

我用一种更简单的方法解决了这个问题。

方法一

你可以从对象字面量中删除dataType: 'json'属性…

两个方法

或者你也可以像@Sagiv所说的那样,将数据返回为Json。


发生此parsererror消息的原因是,当您只是返回一个字符串或另一个值时,它不是真正的Json,因此解析器在解析它时失败。

因此,如果您删除dataType: json属性,它将不会尝试将其解析为json。

使用另一种方法,如果您确保将数据返回为Json,解析器将知道如何正确处理它。

我遇到过这样的错误,但在修改我的响应后,将其发送给客户端,它工作得很好。

//Server side
response = JSON.stringify('{"status": {"code": 200},"result": '+ JSON.stringify(result)+'}');
res.send(response);  // Sending to client

//Client side
success: function(res, status) {
    response = JSON.parse(res); // Getting as expected
    //Do something
}

你应该删除dataType: "json"。然后看看魔法……这样做的原因是你正在将json对象转换为简单的字符串..因此json解析器无法解析该字符串,因为它不是json对象。

this.LoadViewContentNames = function () {
$.ajax({
    url: '/Admin/Ajax/GetViewContentNames',
    type: 'POST',
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
 });
};

确保删除了任何调试代码或其他可能输出非预期信息的内容。有些明显,但很容易忘记在当下。

问题是你的控制器返回的字符串或其他对象不能被解析。 ajax调用期望得到Json作为返回。尝试像这样在控制器中返回JsonResult:

 public JsonResult YourAction()
    {
        ...return Json(YourReturnObject);

    }

希望能有所帮助。