preenchimento automático de jQuery e ASP.NET

Eu procurei em todo este site e na Web por uma boa esimples exemplo de preenchimento automático usando jQuery e ASP.NET. Eu queria expor os dados usados pelo preenchimento automático com um serviço da Web (e provavelmente o farei a seguir). Enquanto isso, eu consegui isso funcionando, mas parece um pouco hacky ...

Na minha página, tenho uma caixa de texto:

<input id="txtSearch" type="text" />

Estou usando o preenchimento automático do jQuery, configurado de acordo com o exemplo deles:

<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>

Aqui é onde começa a ficar hacky ... Chamo uma página em vez de um serviço da web:

  <script type="text/javascript">
    $(document).ready(function(){
        $("#txtSearch").autocomplete('autocompletetagdata.aspx');
    });      
  </script>

Na página, retirei TODO o html e apenas o tenho (caso contrário, vários bits HTML aparecerão no menu suspenso de preenchimento automático):

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="autocompletetagdata.aspx.cs" Inherits="autocompletetagdata" %>

E no meu autocompletetagdata.aspx, estou usando o SubSonic para consultar, formatar e retornar dados do banco de dados (um item de dados por linha):

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());
}

Se você não fizer uma consulta LIKE, ela retornará tudo o que contém uma correspondência para os caracteres digitados - por exemplo, digitar "a" incluirá "Perguntar" e "Resposta", além de "Março" e "Mega". Eu só queria começar com a partida.

Enfim, funciona e é muito fácil de configurar, mas existe uma maneira melhor?

questionAnswers(4)

yourAnswerToTheQuestion