Я пытаюсь получить виджет jQuery UI AutoComplete, работающий с удаленным источником данных в приложении WebForms. Я успешно вызвал свой веб-сервис, но элемент управления не отображает список с возвращенными элементами.
Здесь моя разметка:
<p>
<label for="birds" class="fieldLabel">Company:</label>
<input id="existingProgramCompanyName" type="text" style="width: 350px" />
</p>
И вот мой сценарий:
$("#existingProgramCompanyName").autocomplete({
source: "/Services/ProgramListServices.asmx/FilteredProgramList",
minLength: 3,
select: function (event, ui) {
alert('Got it!');
}
});
Всякий раз, когда я это делал в прошлом, моя самая большая проблема заключалась в возврате данных в правильном формате. Виджет AutoComplete хочет JSON, и поэтому я потратил значительное время на то, чтобы мой код вернул действительный JSON. Здесь фактическая строка возвращается из моей веб-службы:
{
"Companies":[{"Id":"1","Value":"First","Label":"First"},
{"Id":"2","Value":"Second","Label":"Second"},
{"Id":"3","Value":"Third","Label":"Third"}],
"HasData":true,"Message":"","Success":true
}
Действительно ли это JSON?
Элемент управления правильно показывает малое анимированное загрузочное изображение. Мой веб-сервис вызывается и возвращается без ошибок. Но элемент автозаполнения никогда не выводит список.
Кто-нибудь видит какие-либо проблемы с тем, что у меня есть до сих пор? И что будет следующим шагом в попытке устранить эту проблему?
Да, ваша строка действительна JSON, но это не значит, что AutoComplete может ее использовать. Форматы можно увидеть в Autocomplete Widget Source. Я думаю, именно это относится к вашему делу для источника:
* An array of strings: [ "Choice1", "Choice2" ]
* An array of objects with label and value properties: [ { label: "Choice1", value: "value1" }, ... ]
То, что генерирует ваш канал, не будет работать должным образом, независимо от того, окружите его в скобках или нет (вам понадобятся скобки):
$("#existingProgramCompanyName").autocomplete({
source: {"Companies": [{ "Id": "1", "Value": "First", "Label": "First" },
{ "Id": "2", "Value": "Second", "Label": "Second" },
{ "Id": "3", "Value": "Third", "Label": "Third"}],
"HasData": true, "Message": "", "Success": true
}
});
Тем не менее, эта слегка измененная версия (обратите внимание, что случаи строчные):
$("#existingProgramCompanyName").autocomplete({
source: [{ "value": "First", "label": "First" },
{ "value": "Second", "label": "Second" },
{ "value": "Third", "label": "Third"}]
});
Поэтому, чтобы исправить это, я бы подстроил ваш канал JSON для вывода другого формата!
Обновление: возможно, просто попробуйте параметр массива строк для тестирования:
List<string> s = new List<string>();
//populate the list
return new JavaScriptSerializer().Serialize(s);
source
задано строковое значение, строка представляет URL-адрес, как показано в моем коде разметки. Я говорю о JSON, возвращенном из веб-службы, которую вызывает код автозаполнения.