jQuery возвращает "parsererror" для запроса ajax - PullRequest
166 голосов
/ 21 февраля 2011

Получив «parsererror» от jquery для Ajax-запроса, я попытался изменить POST на GET, возвращая данные несколькими различными способами (создание классов и т. Д.), Но я не могу понять, чтопроблема в том.

Мой проект в MVC3, и я использую jQuery 1.5. У меня выпадающий список, и при событии 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".

Ответы [ 16 ]

269 голосов
/ 16 июля 2012

Я недавно столкнулся с этой проблемой и наткнулся на этот вопрос.

Я решил это гораздо более простым способом.

Метод первый

Вы можете удалить свойство dataType: 'json' из литерала объекта ...

Метод второй

Или вы можете делать то, что говорил @Sagiv, возвращая ваши данные как Json.


Причина, по которой возникает это сообщение parsererror, заключается в том, что когда вы просто возвращаете строку или другое значение, на самом деле это не Json, поэтому синтаксический анализатор завершает работу при его синтаксическом анализе.

Таким образом, если вы удалите свойство dataType: json, оно не будет пытаться проанализировать его как Json.

При использовании другого метода, если вы вернете свои данные как Json, синтаксический анализатор будет знать, как правильно их обрабатывать.

27 голосов
/ 21 февраля 2011

См. ответ @ david-east для правильного решения проблемы

Этот ответ относится только к ошибке с jQuery 1.5 при использовании файла: протокол.

У меня недавно была похожая проблема при обновлении до jQuery 1.5. Несмотря на получение правильного ответа, обработчик ошибок сработал. Я решил это с помощью события complete и затем проверил значение статуса. например:

complete: function (xhr, status) {
    if (status === 'error' || !xhr.responseText) {
        handleError();
    }
    else {
        var data = xhr.responseText;
        //...
    }
}
15 голосов
/ 31 мая 2017

Вы указали ответ на вызов ajax dataType как:

'json'

, где фактический ответ ajax недопустимJSON и в результате анализатор JSON выдает ошибку.

Наилучший подход, который я бы порекомендовал, заключается в изменении dataType на:

'text'

и в пределахУспешный обратный вызов проверяет, возвращается ли верный 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);
    }
});
10 голосов
/ 13 июня 2011

проблема в том, что ваш контроллер возвращает строку или другой объект, который не может быть проанализирован.Ожидается, что вызов Ajax вернет Json.попробуйте вернуть JsonResult в контроллер следующим образом:

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

    }

надеюсь, это поможет:)

5 голосов
/ 11 июня 2013

Ваши данные JSON могут быть неверными.http://jsonformatter.curiousconcept.com/, чтобы подтвердить это.

4 голосов
/ 17 июля 2015

Есть множество предложений по удалению

dataType: "json"

Хотя я допускаю, что это работает, это игнорирует основную проблему. Если вы уверены, что возвращаемая строка действительно является JSON, тогда ищите ошибочные пробелы в начале ответа. Подумайте о том, чтобы взглянуть на это в Fiddler. Моя выглядела так:

Connection: Keep-Alive
Content-Type: application/json; charset=utf-8

{"type":"scan","data":{"image":".\/output\/ou...

В моем случае это была проблема с PHP, извергающим нежелательные символы (в данном случае спецификации файлов UTF). После того, как я удалил их, это решило проблему, сохранив при этом

dataType: json
1 голос
/ 25 марта 2014

Убедитесь, что вы удалите любой код отладки или что-либо еще, что может выводить непреднамеренную информацию.Несколько очевидно, но в данный момент легко забываемое.

0 голосов
/ 21 февраля 2019

У меня была такая же проблема, оказалось, что мои web.config были не такими же, как у моих товарищей по команде.Поэтому, пожалуйста, проверьте ваш web.config.

Надеюсь, это кому-нибудь поможет.

0 голосов
/ 01 февраля 2019

Я столкнулся с такой ошибкой, но после изменения моего ответа перед отправкой клиенту он работал нормально.

//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
}
0 голосов
/ 26 сентября 2017

Я также получаю «Запрос возврата с ошибкой: parsererror». в консоли JavaScript. В моем случае это был не Json, но мне пришлось передать в текстовую область просмотра действительную кодировку.

  String encodedString = getEncodedString(text, encoding);
  view.setTextAreaContent(encodedString);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...