一直从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”。


当前回答

我还得到了“请求返回错误:parsererror.”在javascript控制台。 在我的情况下,这不是Json的问题,但我必须传递给视图文本区域一个有效的编码。

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);

其他回答

如果你在IE中使用HTTP get得到这个问题,我通过设置缓存:false来解决这个问题。 由于我对HTML和json请求使用了相同的url,它会命中缓存,而不是执行json调用。

$.ajax({
    url: '/Test/Something/',
    type: 'GET',
    dataType: 'json',
    cache: false,
    data: { viewID: $("#view").val() },
    success: function (data) {
        alert(data);
    },
    error: function (data) {
        debugger;
        alert("Error");
    }
});

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

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

    }

希望能有所帮助。

如果从web .net mvc/api获取操作,请确保允许获取

     return Json(data,JsonRequestBehavior.AllowGet);

请参阅@david-east的回答,了解正确的处理方法

这个答案只与jQuery 1.5中使用file:协议时的错误有关。

我最近在升级到jQuery 1.5时遇到了类似的问题。尽管得到了正确的响应,错误处理程序还是被触发。我通过使用完整事件,然后检查状态值来解决这个问题。例句:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}

这个问题

window.JSON.parse在$中引发错误。parseJSON函数。

<pre>
$.parseJSON: function( data ) {
...
// Attempt to parse using the native JSON parser first
if ( window.JSON && window.JSON.parse ) {
return window.JSON.parse( data );
}
...
</pre>

我的解决方案

使用requirejs工具重载JQuery。

<pre>
define(['jquery', 'jquery.overload'], function() { 
    //Loading jquery.overload
});
</pre>

js文件内容

<pre>
define(['jquery'],function ($) { 

    $.parseJSON: function( data ) {
        // Attempt to parse using the native JSON parser first
        /**  THIS RAISES Parsing ERROR
        if ( window.JSON && window.JSON.parse ) {
            return window.JSON.parse( data );
        }
        **/

        if ( data === null ) {
            return data;
        }

        if ( typeof data === "string" ) {

            // Make sure leading/trailing whitespace is removed (IE can't handle it)
            data = $.trim( data );

            if ( data ) {
                // Make sure the incoming data is actual JSON
                // Logic borrowed from http://json.org/json2.js
                if ( rvalidchars.test( data.replace( rvalidescape, "@" )
                    .replace( rvalidtokens, "]" )
                    .replace( rvalidbraces, "")) ) {

                    return ( new Function( "return " + data ) )();
                }
            }
        }

        $.error( "Invalid JSON: " + data );
    }

    return $;

});
</pre>