Получаю "parsererror" от jquery на Ajax запрос, пробовал менять POST на GET, возвращать данные разными способами (создание классов и т.д.), но никак не могу понять, в чем проблема.
Мой проект выполнен в MVC3 и я использую jQuery 1.5. У меня есть Dropdown, и в событии onchange я запускаю вызов для получения некоторых данных, основанных на том, что было выбрано.
Dropdown: (при этом загружается "Views" из списка в 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'
из литерала объекта...
Метод второй
Либо можно поступить так, как говорил @Sagiv, вернув данные в виде Json
.
Причина появления этого сообщения parsererror
заключается в том, что когда вы просто возвращаете строку или другое значение, оно на самом деле не является Json
, поэтому парсер не справляется с его разбором.
Поэтому если удалить свойство dataType: json
, то он не будет пытаться разобрать его как Json
.
В другом методе, если вы убедитесь, что возвращаете данные в виде Json
, парсер будет знать, как правильно их обрабатывать.
Правильный способ решения проблемы см. в ответе от @david-east.
Этот ответ относится только к ошибке с jQuery 1.5 при использовании файла: protocol..
Недавно у меня возникла похожая проблема при обновлении до jQuery 1.5. Несмотря на получение корректного ответа, срабатывал обработчик ошибки. Я решил эту проблему, используя событие complete
и проверяя значение статуса. Например:
complete: function (xhr, status) {
if (status === 'error' || !xhr.responseText) {
handleError();
}
else {
var data = xhr.responseText;
//...
}
}
Вы указали ответ на AJAX-вызов тип а:
'формата JSON'
где в качестве фактического ответа AJAX не является допустимым JSON и как результат парсера JSON бросает ошибку.
Лучший подход, который я бы порекомендовал изменить тип к:
'текст'
и в успех обратного вызова проверяет, является ли допустимый JSON возвращается или нет, и если проверки JSON не удается, предупредить его на экране так, чтобы его очевидно, с какой целью 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);
}
});
проблема в том, что ваш контроллер возвращает строку или другой объект, который не может быть разобран. Вызов ajax ожидает получить в ответ Json. Попробуйте вернуть JsonResult в контроллере таким образом:
public JsonResult YourAction()
{
...return Json(YourReturnObject);
}
надеюсь, это поможет :)
Ваш JSON-данные могут быть ошибочными. http://jsonformatter.curiousconcept.com/ чтобы проверить это.
Есть много предложений снять
dataType: "json"
Хотя я допускаю, что это работает, это'ы игнорируя основной вопрос. Если вы'вновь уверены, что возвращение строки действительно тогда в JSON искать заблудившихся пробельные символы в начале ответа. Рассмотреть, взглянув на это в Fiddler. Мое выглядело так:
Connection: Keep-Alive
Content-Type: application/json; charset=utf-8
{"type":"scan","data":{"image":".\/output\/ou...
В моем случае это была проблема с PHP извергает нежелательных символов (в этом случае кодировке UTF файл спецификации). После того как я удалил эти ее проблемы, а также сохранение
dataType: json
Если вы получаете эту проблему, используя HTTP-запрос GET, в IE я решил эту проблему путем установки кэша: нет. Как я использовал один и тот же URL на HTML и JSON запросов он попал в кэш вместо того, чтобы делать с помощью 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");
}
});
вы должны удалить тип данных: "в 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");
}
});
};
return Json(data,JsonRequestBehavior.AllowGet);
Я не'т знать, если это по-прежнему актуален, но проблема с кодировкой. Изменения в ANSI решена проблема для меня.
Я уже сталкивался с такой ошибкой, но после изменения моего ответа перед отправкой его клиенту он работал нормально.
//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
}
Я имел такую же проблему, оказалось мой веб.конфиг не совпадает с моей командой. Поэтому, пожалуйста, проверьте ваш интернет.конфигурации`.
Надеюсь, что это помогает кто-то.
Я также получала и"запрос на возврат, ошибка:parsererror." в консоли JavaScript. В моем случае это было´т вопрос JSON, но я должна была передать в представление текстовой области действительного кодирования.
String encodedString = getEncodedString(text, encoding);
view.setTextAreaContent(encodedString);
<б>проблема</б>
окна.В JSON.разобрать выдает ошибку в $.функция 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>
<б>мое решение</б>
Перегрузка на jQuery с использованием <а href="и http://requirejs.org/">инструмент помощью RequireJS</а>.
<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>
Если вы Don'т хотите, чтобы удалить тип данных/изменение: в формате JSON`, вы можете переопределить jQuery с's строгий разбор пользовательские конвертер
:
$.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 {};
}
}
},
...
Используя это, вы можете настроить поведение, когда ответ не может быть проанализирован как JSON (даже если вы получите пустое тело ответа!)
С этого настраиваемого конвертера .сделано()
/успех
будет срабатывать, пока запрос был успешным, в противном случае (1хх или код ответа 2хх).