$ .getJSON () не работает с ASP.NET MVC2 в jQuery 1.5 - PullRequest
0 голосов
/ 03 февраля 2011

Я пробую новый jQuery 1.5, и он сломал несколько вещей в моем приложении. Я вызываю действие, которое генерирует JSON, но что-то выдает ошибку и вызывает остановку сценария. Согласно Fiddler и Firebug, действие возвращает данные JSON. Я не предоставил данные JSON, но они действительны в соответствии с JSONLint.

Обратите внимание, что это работает, как и ожидалось в jQuery 1.4.4.

Первое, что я заметил, был URL: http://localhost:3219/News/GetAllNewsArchives?callback=jQuery15033185029088076134_1296751219270&_=1296751219672

Сценарий:

// Dropdown box for past articles
$("#article-select").ready(function() {
    $.ajaxSetup({ cache: false });
    $.getJSON('/News/GetAllNewsArchives', null, function(json) {
        var items = "<option value=''>(Select)</option>";
        $.each(json, function(i, item) {
            items += "<option value='" + item.Id + "'>" + subject + "</option>";
        });
        $("#article-select").html(items);
    });
});

Действие:

    public ActionResult GetAllNewsArchives()
    {
        return Json(newsRepository.GetAllNewsArchives(), JsonRequestBehavior.AllowGet);
    }

Есть идеи, что я делаю не так?

Ответы [ 4 ]

3 голосов
/ 03 февраля 2011

Хорошо, я переключился на вызов $ .ajax, и у меня была та же ошибка:

// Dropdown box for past articles
$("#article-select").ready(function() {
    $.ajax({
        cache: false,
        type: "POST",
        dataType: "json",
        url: "/News/GetAllNewsArchives",
        success: function(json) {
            var items = "<option value=''>(Select)</option>";
            $.each(json, function(i, item) {
                items += "<option value='" + item.Id + "'>" + subject + "</option>";
            });
            $("#article-select").html(items);
        }
    });

Однако я заметил кое-что в документации $. Ajax () .

Начиная с jQuery 1.5, jQuery может преобразовывать dataType из того, что он получил в заголовке Content-Type, в то, что вам нужно. Например, если вы хотите, чтобы текстовый ответ обрабатывался как XML, используйте «text xml» для dataType. Вы также можете сделать запрос JSONP, получить его в виде текста и интерпретировать с помощью jQuery как XML: «jsonp text xml». Аналогично, сокращенная строка, такая как «jsonp xml», сначала попытается преобразовать из jsonp в xml, а в случае неудачи - из jsonp в текст, а затем из текста в xml.

Я изменил свой тип данных с dataType: "json" на dataType: "text json", тогда он работал.

Теперь я просто не понимаю, почему разница. Что json ожидает, что отличается?

2 голосов
/ 07 февраля 2011

В исходном коде jquery 1.5 это код, определяющий тип содержимого.

// Remove auto dataType and get content-type in the process
while( dataTypes[ 0 ] === "*" ) {
    dataTypes.shift();
    if ( ct === undefined ) {
        ct = jXHR.getResponseHeader( "content-type" );
    }
}

// Check if we're dealing with a known content-type
if ( ct ) {
    for ( type in contents ) {
        if ( contents[ type ] && contents[ type ].test( ct ) ) {
            dataTypes.unshift( type );
            break;
        }
    }

Если вы установите dataType в «json», предыдущий код оставит ct как неопределенное. Вот почему это не работает, как ожидалось. Это проблема в jQuery 1.5, поскольку она нарушает совместимость с предыдущими версиями jQuery.

Таким образом, вы должны установить dataType на "text json" или удалить dataType, чтобы использовать значение по умолчанию.

Значения по умолчанию:

    converters: {

        // Convert anything to text
        "* text": window.String,

        // Text to html (true = no transformation)
        "text html": true,

        // Evaluate text as a json expression
        "text json": jQuery.parseJSON,

        // Parse text as xml
        "text xml": jQuery.parseXML
    }
0 голосов
/ 04 февраля 2011

Какой тип содержимого указан в ответе? Не то, что вы просите или укажите в параметре dataType, а то, что сервер отправляет обратно как тип содержимого ответа (от fiddler)

0 голосов
/ 03 февраля 2011

По какой-то причине он интерпретирует ваш запрос как JSONP. В Firebug, проверьте значение $ .ajaxSettings и убедитесь, что его dataType не имеет значения по умолчанию jsonp.

Вы пытались использовать $.ajax() напрямую, чтобы явно указать в запросе type, dataType и т. Д.?

...