ASP.NET AJAX возвращает JSON, но не распознается как JSON

У меня есть эта функция, чтобы вернуть мне список менеджеров

function getManagers() {
   var jqxhr = $.ajax({
                   type: 'POST',
                   contentType: "application/json; charset=utf-8",
                   url: '/webservice.asmx/GetManagers',
                   dataType: 'json'
               }).success(function(data) {
                   var options = '<option selected="selected" disabled="disabled">Select Manager</option>';
                   for (var i = 0; i < data.length; i++) {
                       options += '<option value="' + data[i].PostRef + '">' + data[i].Description + '</option>';
                   }
                   $('#ReceivingCellManager').html(options);
               }).error(function(data) {
                   $('.ErrorText').html('Manager load failed please refresh page with F5');
                   $("#errormessage").dialog('open');
               }).complete(function() {
           });
} 

как видите, я использую JQuery и хочу заполнить раскрывающийся список с доступными менеджерами

метод в моей службе выглядит так

    [WebMethod]
    [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
    public void GetManagers()
    {
        using (var context = new ConcessionModel())
        {             
            var rcm = Business.GetManager();
            var serializer = new JavaScriptSerializer();
            var response = rcm.Count() != 0
                ? serializer.Serialize(rcm)
                : serializer.Serialize(new Error { Code = "500", Message = "Manager Retrieval Failed" });
            this.Context.Response.Clear();
            this.Context.Response.ContentType = "application/json";
            this.Context.Response.Write(response);
        }
    }

Когда вызывается метод, я получаю ответ 200 OK, и ответ содержит JSON. Я хочу, чтобы проблема заключалась в том, что ответ не распознается как JSON.

Я ПОПРОБОВАЛА

  • добавление dataType к вызову ajax, как вы можете видеть выше
  • Удалив this.Context.Response.flush из конца ответа, я вылечил ошибку, которую я получал при настройке заголовков после их отправки.
  • добавление формата ответа к методу
  • добавление Response.ContentType к контексту. Все они не помогли мне добиться необходимого распознавания JSON. Любая помощь приветствуется.

ОБНОВЛЕНИЕ: ФОРМАТ JSON

{"Описание": "данные", "Код": "данные", "ссылка": "данные"}

ОБНОВЛЕНИЕ ОТВЕТА JSON. Я вижу что-то странное в своем ответе. Мой ответ выглядит следующим образом

[{"Description":"data","Code":"data","reference":"data"}]{"d":null}

Я не уверен, что это за объект d null


person Deviland    schedule 30.03.2012    source источник
comment
почему бы вам не использовать WCF (с REST) ​​и ответ JSON? ... преобразовывать все самостоятельно - это действительно ужасно!   -  person    schedule 30.03.2012
comment
Содержат ли ваши данные об успехах JSON, и не могли бы вы опубликовать образец дампа? :)   -  person Marco Johannesen    schedule 30.03.2012
comment
@MarcoJohannesen благодарит за ответ. Нет, успех не срабатывает, а срабатывает ошибка. Я только что провел небольшой тест, и ошибка тоже не содержит данных.   -  person Deviland    schedule 30.03.2012
comment
Проверьте ответ, используя что-то вроде fiddler, чтобы узнать, какую ошибку вы получаете в своем коде.   -  person Richard Dalton    schedule 30.03.2012
comment
@MarcoJohannesen Я не могу публиковать данные здесь, так как они содержат некоторые конфиденциальные элементы, однако я опубликую формат   -  person Deviland    schedule 30.03.2012
comment
@RichardD спасибо, попробовав сейчас   -  person Deviland    schedule 30.03.2012
comment
Я просмотрел Fiddler на запрос и ответ, и Fiddler может видеть и распознавать данные, возвращенные как JSON.   -  person Deviland    schedule 30.03.2012
comment
Если вы используете предупреждение (данные) или console.log (данные), правильно ли он сбрасывает данные?   -  person Marco Johannesen    schedule 30.03.2012
comment
@MarcoJohannesen. Если я сделаю это, мне будет возвращен объект. Просмотрите мои последние изменения, чтобы узнать, что я нашел.   -  person Deviland    schedule 30.03.2012


Ответы (5)


Чтобы получить доступ к json-объекту, например объекту класса «Dog» из службы, тип возвращаемого значения метода должен быть «Dog». Не используйте response.write в сервисах. Затем вы можете получить доступ к данным из сообщения об успешном выполнении, используя data.d.

Надеюсь это поможет!

person Kevin Vella    schedule 30.03.2012

решил проблему, удалив contentType из запроса ajax и добавив настройки в веб-конфигурацию, как описано в этом сообщении формат запроса не распознан для URL, неожиданно оканчивающегося на

Спасибо за вашу помощь, 1 взлет :)

person Deviland    schedule 30.03.2012
comment
После 3 дней чесания головы и борьбы, ваше решение помогло мне. Большое спасибо. - person Tushit Nagda; 31.03.2017

Попробуйте разобрать его, как я показал ниже, у меня это работает:

var result = JSON.parse(data, function (key, value) {
                    var type;
                    if (value && typeof value === 'object') {
                        type = value.type;
                        if (typeof type === 'string' && typeof window[type] === 'function') {
                            return new (window[type])(value);
                        }
                    }
                    return value;
                });

И измените данные на результат:

for (var i = 0; i < result.length; i++) {
                       options += '<option value="' + result[i].PostRef + '">' + result[i].Description + '</option>';
                   }
person Dhaval Shukla    schedule 30.03.2012
comment
@dhavaishukla Я не думаю, что мне нужно анализировать данные в JSON, так как это должен быть ожидаемый возвращаемый тип данных, если я ошибаюсь, дайте мне знать - person Deviland; 30.03.2012

В функции успеха возвращаемый объект - это «данные».

Чтобы получить доступ к данным json, вам необходимо получить к ним доступ через data.d.

Я ничего не могу поделать, но заметил, что ваш веб-сервис возвращает void, может быть, это тоже может быть причиной отсутствия ответа ??

person Kevin Vella    schedule 30.03.2012
comment
Я обращаюсь к объекту данных как к данным внутри цикла, службы возвращают void, потому что они пишут ответ, не возвращающий стандартный объект. - person Deviland; 30.03.2012
comment
вместо того, чтобы писать ответ, верните весь объект. Тогда метод ajax распознает его как json! - person Kevin Vella; 30.03.2012

Это сработало для меня:

[WebMethod]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]
public void HelloWorld() {

    JavaScriptSerializer serializer = new JavaScriptSerializer();

    string strResponse = serializer.Serialize("World"); ;

    Context.Response.Clear();
    Context.Response.ContentType = "application/json";
    Context.Response.AddHeader("content-length", strResponse.Length.ToString());
    Context.Response.Flush();

    Context.Response.Write(strResponse);


}
person Andre Evangelista    schedule 11.05.2015
comment
Молодец! Спасибо! - person toha; 18.05.2017