Я искал по всему этому сайту и в Интернете хороший пример автозаполнения с использованием просто с использованием jQuery и ASP.NET. Я хотел предоставить данные, используемые при автозаполнении, с помощью веб-сервиса (и, вероятно, сделаю это в следующий раз). Между тем, у меня это работает, но это кажется немного взломанным ...
На моей странице есть текстовое поле:
<input id = "txtSearch" type = "text" />
Я использую автозаполнение jQuery, настроенное по их примеру:
<link rel = "stylesheet" href = "js/jquery.autocomplete.css" type = "text/css" />
<script type = "text/javascript" src = "js/jquery.bgiframe.js"></script>
<script type = "text/javascript" src = "js/jquery.dimensions.pack.js"></script>
<script type = "text/javascript" src = "js/jquery.autocomplete.js"></script>
Здесь начинается взлом ... Я вызываю страницу вместо веб-сервиса:
<script type = "text/javascript">
$(document).ready(function(){
$("#txtSearch").autocomplete('autocompletetagdata.aspx');
});
</script>
На странице я вырезал ВСЕ html и просто получил это (в противном случае в раскрывающемся списке автозаполнения отображаются различные биты HTML):
<%@ Page Language = "C#" AutoEventWireup = "true" CodeFile = "autocompletetagdata.aspx.cs" Inherits = "autocompletetagdata" %>
А в моем autocompletetagdata.aspx я использую SubSonic для запроса, форматирования и возврата данных из базы данных (по одному элементу данных в строке):
protected void Page_Load(object sender, EventArgs e)
{
// Note the query strings passed by jquery autocomplete:
//QueryString: {q=a&limit=150×tamp=1227198175320}
LookupTagCollection tags = Select.AllColumnsFrom<LookupTag>()
.Top(Request.QueryString["limit"])
.Where(LookupTag.Columns.TagDescription).Like(Request.QueryString["q"] + "%")
.OrderAsc(LookupTag.Columns.TagDescription)
.ExecuteAsCollection<LookupTagCollection>();
StringBuilder sb = new StringBuilder();
foreach (LookupTag tag in tags)
{
sb.Append(tag.TagDescription).Append("\n");
}
Response.Write(sb.ToString());
}
Если вы не выполняете запрос LIKE, он возвращает все, что содержит совпадение для вводимых вами символов - например, ввод «a» будет включать «Спросить» и «Ответить», а также «Март» и "Мега." Я просто хотел, чтобы он начал с матча.
В любом случае, это работает, и его довольно легко настроить, но есть ли способ лучше?
Теперь это устарело и интегрировано с пользовательским интерфейсом JQuery - learningjquery.com/2010/06/autocomplete-migration-guide показывает, как мигрировать, а не много!





Я недавно реализовал автозаполнение, и оно выглядит довольно похоже. Я использую ashx (универсальный обработчик) вместо aspx, но в основном это тот же код в коде позади.
Используя ashx, это будет выглядеть примерно так:
<script type = "text/javascript">
$(document).ready(function(){
$("#txtSearch").autocomplete('autocompletetagdata.ashx');
});
</script>
[WebService(Namespace = "http://www.yoursite.com/")]
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class AutocompleteTagData : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
// Note the query strings passed by jquery autocomplete:
//QueryString: {q=a&limit=150×tamp=1227198175320}
LookupTagCollection tags = Select.AllColumnsFrom<LookupTag>()
.Top(context.Request.QueryString["limit"])
.Where(LookupTag.Columns.TagDescription).Like(context.Request.QueryString["q"] + "%")
.OrderAsc(LookupTag.Columns.TagDescription)
.ExecuteAsCollection<LookupTagCollection>();
foreach (LookupTag tag in tags)
{
context.Response.Write(tag.TagDescription + Environment.NewLine);
}
}
public bool IsReusable
{
get
{
return false;
}
}
}
Были ли у вас проблемы с разрешениями в IIS для файла ashx? Я использовал этот метод, и когда я развертываю приложение в IIS 6, браузер не может получить доступ к файлу ashx.
Я думаю, что новый jQuery AutoComplete использует свойство «term» вместо «limit», если этот код не основан на другом подключаемом модуле. Из документации API jQuery: «Объект запроса с единственным свойством, называемым« термин », который относится к значению, которое в данный момент находится в текстовом вводе. Например, когда пользователь ввел« новый год »в поле города, термин автозаполнения будет равен« новый год » .jqueryui.com/demos/autocomplete/#remote
limit - максимальное количество возвращаемых результатов. Однако он может отправлять term вместо q, как в этом примере ...
Веб-служба или служба WCF дадут вам возможность улучшить интерфейс. Оба они также могут быть настроены для сериализации Json.
Поскольку во время написания я беру класс WCF (правда, у меня перерыв!), Я набросаю метод WCF.
[OperationContract]
[WebInvoke(RequestFormat=WebMessageFormat.Json,
ResponseFormat=WebMessageFormat.Json)]
public LookupTagCollection LookupTags( int limit, string q )
{
return Select.AllColumnsFrom<LookupTag>()
.Top(limit)
.Where(LookupTag.Columns.TagDescription)
.Like(q+ "%")
.OrderAs(LookupTag.Columns.TagDescription)
.ExecuteAsCollection<LookupTagCollection>();
}
LookupTagCollection должен быть сериализуемым.
К сожалению, виджет автозаполнения не ожидает JSON, ему просто нужен текст, каждый элемент в новой строке. Но для JSON это выглядит неплохо. Какой URL-адрес вы бы использовали для доступа к нему?
Я только что опубликовал это по другому вопросу, но вы можете переопределить функцию синтаксического анализа в подключаемом модуле автозаполнения jQuery, чтобы он поддерживал любой вывод.
Пример:
$("#<%= TextBox1.ClientID %>").autocomplete("/Demo/WebSvc.asmx/SuggestCustomers", {
parse: function(data) {
var parsed = [];
$(data).find("string").each(function() {
parsed[parsed.length] = {
data: [$(this).text()],
value: $(this).text(),
result: [$(this).text()]
};
});
return parsed;
},
dataType: "xml"
});
Все, что ожидает - это строковый массив в XML ... Очень просто сделать ... Если вы используете SubSonic, вам следует проверить RESTHandler (это скрытый ДРАГОЦЕННЫЙ КАМЕНЬ !!!), он поддерживает базовые запросы ко всем вашим объектам и может вернуть JSON / XML. Вот пример запроса с его использованием ...
/Demo/services/Customers/list.xml?CustomerName=JOHN
Если вы измените list.xml на list.json, он изменит результаты на JSON. Приведенный выше запрос вернет строго типизированную сущность «Клиент». Вы можете изменить параметр, чтобы поддерживать НРАВИТСЯ, НЕ НРАВИТСЯ и т.д ... Очень мощный, и вся сантехника уже сделана ...
Вот видео об этом: http://subsonicproject.com/tips-and-tricks/webcast-using-subsonic-s-rest-handler/
Это фактический ответ на обработку XML с помощью пары имя / значение. Отмеченный выше ответ предназначен только для отображаемого текста - вы не можете установить / получить пару значений.
Автозаполнение JQuery 1.8 использует "термин", а не "q" в качестве параметра строки запроса. это короткая и приятная версия, которую я реализовал. Надеюсь, это кому-то поможет.
Javascript:
$(function () {
$("#autocomplete").autocomplete({
source: "/pathtohandler/handler.ashx",
minLength: 1,
select: function (event, ui) {
$(this).val(ui.item.value);
}
});
});
Обработчик ASHX:
public class SearchHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
var term = context.Request.QueryString["term"].ToString();
context.Response.Clear();
context.Response.ContentType = "application/json";
var search = //TODO implement select logic based on the term above
JavaScriptSerializer jsSerializer = new JavaScriptSerializer();
string json = jsSerializer.Serialize(search);
context.Response.Write(json);
context.Response.End();
}
public bool IsReusable
{
get
{
return false;
}
}
}
Спасибо, djuth, это отлично работает и очень просто! Я должен признать, что это довольно ограничивает, хотя, например, я бы хотел, чтобы он автоматически заполнял имя персонала, а затем возвращал StaffID, но я, вероятно, могу поиграть с тем, что добавлено и проанализировано.