Автозаполнение jQuery и ASP.NET

Я искал по всему этому сайту и в Интернете хороший пример автозаполнения с использованием просто с использованием 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&timestamp=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» будет включать «Спросить» и «Ответить», а также «Март» и "Мега." Я просто хотел, чтобы он начал с матча.

В любом случае, это работает, и его довольно легко настроить, но есть ли способ лучше?

Спасибо, djuth, это отлично работает и очень просто! Я должен признать, что это довольно ограничивает, хотя, например, я бы хотел, чтобы он автоматически заполнял имя персонала, а затем возвращал StaffID, но я, вероятно, могу поиграть с тем, что добавлено и проанализировано.

Mark Kadlec 15.07.2009 03:27

Теперь это устарело и интегрировано с пользовательским интерфейсом JQuery - learningjquery.com/2010/06/autocomplete-migration-guide показывает, как мигрировать, а не много!

Duncan 23.07.2011 15:47
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
50
2
92 510
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Я недавно реализовал автозаполнение, и оно выглядит довольно похоже. Я использую 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&timestamp=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.

Gromer 18.08.2009 20:35

Я думаю, что новый jQuery AutoComplete использует свойство «term» вместо «limit», если этот код не основан на другом подключаемом модуле. Из документации API jQuery: «Объект запроса с единственным свойством, называемым« термин », который относится к значению, которое в данный момент находится в текстовом вводе. Например, когда пользователь ввел« новый год »в поле города, термин автозаполнения будет равен« новый год » .jqueryui.com/demos/autocomplete/#remote

atconway 08.09.2011 22:26
limit - максимальное количество возвращаемых результатов. Однако он может отправлять term вместо q, как в этом примере ...
bdukes 08.11.2011 23:10

Веб-служба или служба 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-адрес вы бы использовали для доступа к нему?

bdukes 21.11.2008 18:20

Я только что опубликовал это по другому вопросу, но вы можете переопределить функцию синтаксического анализа в подключаемом модуле автозаполнения 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 с помощью пары имя / значение. Отмеченный выше ответ предназначен только для отображаемого текста - вы не можете установить / получить пару значений.

eduncan911 15.07.2009 06:36

Автозаполнение 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;
        }
    }
}

Другие вопросы по теме