jQuery返回“parsererror”为ajax请求
从jquery得到一个“parsererror”为一个Ajax请求,我试图改变POST到一个GET,以不同的方式返回数据(创build类等),但我似乎无法弄清楚是什么问题。
我的项目是在MVC3和我正在使用jQuery 1.5我有一个下拉列表和onchange事件我发起一个调用来获取一些基于select的数据。
下拉菜单:(从Viewbag中的列表中加载“视图”并触发事件工作正常)
@{ 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”。
我最近遇到这个问题,偶然发现了这个问题。
我用一个更简单的方法解决了它。
方法一
你可以从对象文字中删除dataType: 'json'
属性…
方法二
或者,您可以通过将您的数据作为Json
返回来做什么@Sagiv。
这个parserror
消息发生的原因是当你简单的返回一个string或者其他的值时,它并不是真正的Json
,所以parsing器parsing的时候会失败。
所以如果你删除dataType: json
属性,它不会试图把它parsing为Json
。
如果您确定以Json
返回数据,则parsing器将知道如何正确处理它。
请参阅@ david-east的答案 ,了解处理问题的正确方法
这个答案只与使用file:protocol时jQuery 1.5的一个bug有关。
升级到jQuery 1.5时最近有类似的问题。 尽pipe得到了一个正确的响应error handling程序被解雇 我解决了它通过使用complete
事件,然后检查状态值。 例如:
complete: function (xhr, status) { if (status === 'error' || !xhr.responseText) { handleError(); } else { var data = xhr.responseText; //... } }
问题是你的控制器返回的string或其他对象不能被parsing。 ajax调用预计会得到Json的回报。 试着像这样在控制器中返回JsonResult:
public JsonResult YourAction() { ...return Json(YourReturnObject); }
希望能帮助到你 :)
你的JSON数据可能是错误的。 http://jsonformatter.curiousconcept.com/来validation它。;
您已经将ajax调用响应数据types指定为:
'JSON'
因为实际的ajax响应不是有效的JSON,因此JSONparsing器会抛出错误。
我build议的最佳方法是将数据types更改为:
'文本'
并在成功callback内validation是否返回有效的JSON,如果JSONvalidation失败,请在屏幕上提醒它,以便明确ajax调用实际上失败的目的。 看看这个:
$.ajax({ url: '/Admin/Ajax/GetViewContentNames', type: 'POST', dataType: 'text', data: {viewID: $("#view").val()}, success: function (data) { try { var output = JSON.parse(data); alert(output); } catch (e) { alert("Output is not valid JSON: " + data); } }, error: function (request, error) { alert("AJAX Call Error: " + error); } });
有很多build议要删除
dataType: "json"
虽然我承认这是有效的,但却忽视了潜在的问题。 如果您确信返回string确实是JSON,则在响应开始时查找错误的空白。 考虑在小提琴看看它。 矿看起来像这样:
Connection: Keep-Alive Content-Type: application/json; charset=utf-8 {"type":"scan","data":{"image":".\/output\/ou...
在我的情况下,这是PHP喷出不需要的字符(在这种情况下UTF文件的BOM)的问题。 一旦我删除这些问题,同时也解决了问题
dataType: json
确保您删除任何可能会输出意外信息的debugging代码或其他任何内容。 有些显而易见,但是现在很容易忘记。
我不知道这是否仍然是实际的,但问题与编码。 更改为ANSI解决了我的问题。
如果你在IE中使用HTTP GET得到这个问题,我通过设置cache:false来解决这个问题。 正如我使用相同的url为HTML和JSON请求它击中caching,而不是做一个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"); } });
你应该删除dataType:“json”。 然后看魔术…做这样的事情的原因是,你正在转换json对象为简单的string..所以jsonparsing器不能parsing该string,因为不是一个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"); } }); };
从networking.net mvc / api获取操作,确保你得到允许
return Json(data,JsonRequestBehavior.AllowGet);
我也得到“请求返回错误:parsererror”。 在JavaScript控制台。 在我的情况下,这不是JSON的问题,但我必须传递到视图文本区域有效的编码。
String encodedString = getEncodedString(text, encoding); view.setTextAreaContent(encodedString);
问题
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>
我的解决scheme
使用requirejs工具重载JQuery。
<pre> define(['jquery', 'jquery.overload'], function() { //Loading jquery.overload }); </pre>
jquery.overload.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>
如果您不想删除/更改dataType: json
,则可以通过定义自定义converter
来覆盖jQuery的严格parsing:
$.ajax({ // We're expecting a JSON response... dataType: 'json', // ...but we need to override jQuery's strict JSON parsing converters: { 'text json': function(result) { try { // First try to use native browser parsing if (typeof JSON === 'object' && typeof JSON.parse === 'function') { return JSON.parse(result); } else { // Fallback to jQuery's parser return $.parseJSON(result); } } catch (e) { // Whatever you want as your alternative behavior, goes here. // In this example, we send a warning to the console and return // an empty JS object. console.log("Warning: Could not parse expected JSON response."); return {}; } } }, ...
使用这个,你可以自定义响应不能被parsing为JSON的行为(即使你得到一个空的响应体!)
使用此自定义转换器,只要请求成功(1xx或2xx响应代码),就会触发.done()
/ success
。