2010-11-30 2 views
2

Я пытаюсь получить код автозаполнения JQueryUI, работающий с веб-службой ASMX. Я приближаюсь, но вчера ударил еще одну стену. Данные JSON возвращаются в формате {d: "data"} (см. http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx). Мои данные теперь выглядит следующим образом:JSON возвратил данные в формате {d: "data"}

d: "[{"DOTNumber":"001061010","JobTitle":"Project Architect"},{"DOTNumber":"003061005","JobTitle":"Principal Electrical Engineer"}]" 

Мой код:

$(function() { 
    function log(message) { 
     $("<div/").text(message).prependTo("#log"); 
     $("#log").attr("scrollTop", 0); 
    } 
}); 

$("#dotmatch").autocomplete({ 
    source: function(request, response) { 
     $.ajax({ 
      type: "POST", 
      url: "/AutoSuggestJSTest/AutoSuggest.asmx/DOTFind", 
      contentType: 'application/json', 
      dataType: "json", 
      data: JSON.stringify({ prefixText: request.term, count: 20 }), 
      error: function(XMLHttpRequest, textStatus, errorThrown) { 
       alert(textStatus); 
      }, 
      success: function(data) { 
       var safe = data; 
       response($.map(safe.d, function(item) { 
        return { 
         label: item.JobTitle + "(" + item.DOTNumber + ")", 
         value: item.DOTNumber 
        } 
       })); 
      } 
     }); 
    }, 
    minLength: 2, 
    select: function(event, ui) { 
     log(ui.item ? 
       "Selected: " + ui.item.value + " aka " + ui.item.id : 
       "Nothing selected, input was " + this.value); 
     $get("DOTNumber").value = ui.item.value; 
    }, 
}); 

Проблема заключается в функции успеха.

Каков правильный синтаксис, чтобы преодолеть проблему «d»?

+0

Вы уверены, что используете autocomplete правильно? Из версии, на которую я смотрю, ajax обрабатывается в функции автозаполнения. Использование: автозаполнение (url или data, [options]) http://docs.jquery.com/Plugins/Autocomplete/autocomplete#url_or_dataoptions – wajiw 2010-11-30 17:06:37

+0

Я видел десятки статей по этой проблеме, и код действительно работает, но данные JSON будучи обернутым, как я описал. См. Ссылку на haacked.com. – 2010-11-30 17:15:49

ответ

2

Ваши данные должны выглядеть следующим образом:

{"d":[{"DOTNumber":"001061010","JobTitle":"Project Architect"},"DOTNumber":"003061005","JobTitle":"Principal Electrical Engineer"}]} 

Кажется, у вас отсутствуют котировки вокруг вашего «d», и у вас есть дополнительные кавычки вокруг вашего массива.

Не eval() ваши данные - это открывает вам больше проблем с безопасностью, чем d: предотвращено .. У вас должен быть доступ к JSON.parse() или если нет jQuery.parseJSON() (который обертывает JSON.parse() если доступно ... зависит от вашей целевой платформы (ов)).

0

Это был невероятно сложный процесс, но я, наконец, получил его работу. Было несколько препятствий: 1) Моя возвращаемая строка JSON была обернута в обложку XML, поэтому она не будет анализировать 2) Для решения этой проблемы требуется contentType: 'application/json' line 3) С этим типом контента , требуется POST. GET не работает 4) POST требует, чтобы данные были объединены вместе с помощью JSON.stringify. Я до сих пор не уверен в этом, но где-то я нашел код. 5) Данные, возвращаемые с POST, имели префикс «d» (см.: http://haacked.com/archive/2008/11/20/anatomy-of-a-subtle-json-vulnerability.aspx) 6) для получения доступа к самой информации требовалась строка «eval (data.d)».

$("#dotmatch").autocomplete({ 
     source: function(request, response) { 
      $.ajax({ 
       type: "POST", 
       url: "/AutoSuggestJSTest/AutoSuggest.asmx/DOTFind", 
       contentType: 'application/json', 
       dataType: "json", 
       data: JSON.stringify({ prefixText: request.term, count: 20 }), 
       success: function(data) { 
        var output = eval(data.d); 
        response($.map(output, function(item) { 
         return { 
          label: item.JobTitle + "(" + item.DOTNumber + ")", 
          value: item.DOTNumber 
         } 
        })); 
       }, 
       error: function(XMLHttpRequest, textStatus, errorThrown) { 
        alert(textStatus); 
       } 
      }); 
     }, 
     minLength: 2 
    }); 

Если я когда-нибудь это много хлопот писать несколько строк кода снова, я собираюсь взять очень большой Guage дробовик на мой компьютер!

Боб Джонс

0

Если вы используете службу WCF JSON с webHttpBehavior (вместо enableWebScriptBehavior), он не будет издавать "D"

+0

Я попытался использовать WCF, но обнаружил, что он слишком дергается и трудно настраивается, поэтому я вернулся к традиционным веб-службам ASMX. Что вызывает «d», это .NET, пытающийся защитить возвращенные данные. – 2010-12-02 18:21:23