JQuery JSON вызов веб-сайта ASP .NET успешно в IE, но не в Firefox или Chrome - PullRequest
0 голосов
/ 14 апреля 2011

Я получаю JSON со своего веб-сайта ASP .NET, используя следующий jQuery:

$.ajax({
  type: 'POST',
  url: '/blah/default.aspx/GetTestData',
  contentType: 'application/json; charset=utf-8',
  dataType: 'json',
  success: function(output) {
      var viewModel = $.parseJSON(output.d);
      ko.applyBindings(viewModel);
}

});

А затем использовать библиотеку Knockout для обновления моего интерфейса. Серверный код в default.aspx для получения данных выглядит следующим образом.

[WebMethod]
public static string GetTestData()
{
    var viewModel = null; // Get viewModel data from elsewhere.
    return new JavaScriptSerializer().Serialize(viewModel);
}

Это нормально работает в IE, но когда я пытаюсь в Chrome и Firefox, JSON не возвращается. Моя точка останова на стороне сервера получает удар, поэтому веб-метод вызывается, но что-то происходит, когда он возвращается в браузер.

Я думаю, это может быть связано с настройкой содержимого или типов MIME на стороне браузера или веб-сервера, но мне пока не повезло, у кого-нибудь есть какие-либо предложения?

Ответы [ 4 ]

1 голос
/ 14 апреля 2011

На самом деле вы можете избежать сериализации и синтаксического анализа, если ваш метод Page просто возвращает ваш объект.

Итак, это будет выглядеть так:

[WebMethod]
public static ViewModel GetTestData()
{
    var viewModel = createOrGetMyViewModelObjectFromSomewhere();
    return viewModel;
}

На стороне JavaScript это будетвыглядят так:

$.ajax({
    type: 'POST',
    url: '/blah/default.aspx/GetTestData',
    data: "{}",
    contentType: 'application/json; charset=utf-8',
    dataType: 'json',
    success: function (output) {
        var viewModel = output.d;
        ko.applyBindings(viewModel);
    }
});

Итак, вам не нужно сериализовать его в .NET, и вам не нужно анализировать его на стороне клиента.Все это обрабатывается «сантехникой» с обеих сторон.Кроме того, важна передача data: "{}" (или если вам нужны параметры, они бы пошли сюда).

Кроме того, если вы вызываете веб-сервис вместо Page Method, то вам нужно украсить класс с помощью[ScriptService] атрибут.

0 голосов
/ 14 апреля 2011

Эй, попробуйте поставить пустой data параметр над dataType: 'json', например,

    data: "{}",
dataType: 'json',

, который сделает трюк !!

0 голосов
/ 14 апреля 2011

Я не ясно понял. Если вы не можете разобрать строку JSON, попробуйте этот магический код:

var viewModel = eval('(' + data + ')');

где data - ваш ответ от сервера.

0 голосов
/ 14 апреля 2011

Что если вы удалите параметр contentType?

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