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 ]

0 голосов
/ 15 июня 2017

Если вы не хотите удалять / изменять dataType: json, вы можете переопределить строгий анализ jQuery, определив пользовательский converter:

$.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 (даже если вы получаете пустое тело ответа!)

С этим пользовательским конвертером, .done() / success будет запускаться, пока запрос былв противном случае успешно (код ответа 1xx или 2xx).

0 голосов
/ 04 августа 2016

в случае операции Get из web .net mvc / api, убедитесь, что вы можете получить

     return Json(data,JsonRequestBehavior.AllowGet);
0 голосов
/ 29 марта 2016

вы должны удалить 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");
    }
 });
};
0 голосов
/ 19 июня 2015

Если вы получили эту проблему, используя HTTP GET в IE, я решил эту проблему, установив кеш: false.Поскольку я использовал один и тот же 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");
    }
});
0 голосов
/ 09 мая 2015

Я не знаю, если это все еще актуально, но проблема была с кодировкой. Переход на ANSI решил проблему для меня.

0 голосов
/ 11 марта 2013

Проблема

window.JSON.parse вызывает ошибку в функции $ .parseJSON.

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

Myрешение

Перегрузка JQuery с использованием requirejs tool .

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

jquery.overload.js содержимое файла

<code><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 $;

});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...