ASP.NET AJAX возвращает JSON, но не распознается как JSON - PullRequest
1 голос
/ 30 марта 2012

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

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 объект

Ответы [ 5 ]

5 голосов
/ 30 марта 2012

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

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

2 голосов
/ 30 марта 2012

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

Спасибо за вашу помощь 1 повсюду вокруг:)

1 голос
/ 11 мая 2015

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

[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);


}
1 голос
/ 30 марта 2012

В функции успеха возвращаемым объектом является «data».

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

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

1 голос
/ 30 марта 2012

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

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>';
                   }
...