Desenvolvimento - ASP. NET

Construindo um List Suggest com ASP.NET Web Services e JQuery

Neste artigo apresento de forma simples e direta como podemos criar um List Suggest para nosso web site buscando a equivalencia do termo digitado no banco de dados utilizando ASP.NET Web Services e JQuery.

por Fabrício Lopes Sanchez



Se você é desenvolvedor web, com certeza possui uma ideia fixa (se não possui, deveria possuir)- os aplicativos web devem prover mecanismos eficientes de busca de conteúdos para os usuários. Para alcançar tal objetivo, desenvolvedores e designers propõem a cada dia novos mecanismos e recursos para tal. Dentre esses recursos, um dos que mais me agrada é o conhecido “List Suggest” (em português, Lista de Sugestões).

Para quem não conhece, uma lista de sugestões é o mecanismo que permite ao usuário buscar um conteúdo por nome ou parte dele e, na medida em que a digitação vai sendo realizada, uma lista de nomes semelhantesseja exibida abaixo do campo de busca, possibilitando assim, que o mesmo selecione a opção desejada sem precisar digitar todo o nome. Este é um recurso bastante interessante e está presente em diversos sites e sistemas pela web, sendo que, o maior exemplo que podemos citar é o Google.

Este artigo apresenta uma forma simples e rápida de programarmos uma lista de sugestões utilizando ASP.NET Web Services, um banco de dados e a biblioteca JQuery UI, que já traz nativamente um recurso de auto complete. O que faremos aqui é criar um WebService que se conectará a um banco de dados e retornará em JSON os dados da tabela e, em seguida, consumiremos este Web Service com a biblioteca JQuery UI.

Muito bem, vamos então criar um novo projeto do tipo “ASP.NET Empty Web Application” e adicionar um arquivo chamado Default.aspx. Após efetuar este processo, sua Solution Explorer deverá estarestar semelhante aquela apresentada na Figura 1.

Descrição: http://fabriciosanchez.com.br/site/wp-content/uploads/2010/08/List1.jpg

Figura 1: Solution Explorer após a adição do arquivo Default.aspx

Em seguida abra a página Default.aspx, alterne o modo de visualização para Source e, dentro das Tag’s <form></form> insira o trecho de código apresentado na Listagem 1.

1

2

3

4

<div class="ui-widget">

    <label for="tags">Busca de produto: </label>

    <input id="tags" />

</div>

Listagem 1: Trecho de código que insere um TextBox

Agora, vamos adicionar um novo arquivo ao nosso projeto. O arquivo que iremos adicionar é um Web Service File (ASMX). Para isso, vá até a Solution Explorer de seu projeto e dê um clique com o botão direito e selecione Add > New Item… > Web (do lado esquerdo) > Web Service. Nomeie o Web Service como WSProducts.asmx e em seguida Add. Muito bem, adicionamos um Web Service a nosso projeto. Ao final deste projeto sua Solution Explorer deverá estar semelhante a Figura 2.

Descrição: http://fabriciosanchez.com.br/site/wp-content/uploads/2010/08/List2.jpg

Figura 2: Solution Explorer após a adição do WS ao projeto

Muito bem, este WS (Web Service) será o grande responsável por “ir” até o banco de dados, buscar a palavra que o usuário digitou e retornar as semelhantes em formato JSON (em um artigo futuro falaremos especificamente sobre JSON).

Para que possamos retornar a informação resultante da consulta em JSON, precisamos de uma classe auxiliar que implemente os recursos de “serialização” e “des-serialização”. Vamos então adicionar a referencia desta DLL a nosso projeto.

Baixando e incorporando a extensão JSON

O primeiro passo é realizar o download da biblioteca no codeplex. Para isso, basta clicar no seguinte link: http://json.codeplex.com/. Após o download descompacte o pacote em um diretório de sua preferência. Vamos então adicionar a referência da DLL a nosso projeto. Vá até a Solution Explorer e na opção “References” clique com o botão direito e selecione a opção “Add reference…”. Clique na abra “Browse” e navegue até a pasta onde descompactou o pacote baixado. Neste local, selecione o arquivo com o nome “Newtonsoft.Json.dll” e dê um duplo clique. Sua tela deverá estar semelhante aquela apresentada na Figura 3.

Descrição: http://fabriciosanchez.com.br/site/wp-content/uploads/2010/08/List3.jpg

Figura 3: Inserindo a referência da biblioteca JSON

Muito bem, após clicar em OK estamos aptos a utilizar os recursos implementados na biblioteca. Vamos então a implementação de nosso WS. Se já não estiver aberto, abra o Web Service e implemente código apresentado na Listagem 2.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.Services;

using System.Data;

using System.Data.Sql;

using System.Data.SqlClient;

using Newtonsoft.Json;

using System.Web.Script.Services;

namespace ListSuggest

{

    [WebService(Namespace = "ListSuggest")]

    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]

    [System.Web.Script.Services.ScriptService]

    public class WSProducts : System.Web.Services.WebService

    {

        [WebMethod]

        [ScriptMethod(ResponseFormat = ResponseFormat.Json)]

        public string retornaProdutos(string _criterio)

        {

            string stringConexao = @"Data Source=Fabricio-PC;Initial Catalog=Northwind;User ID=sa;Password=shell";

            SqlConnection conexao = new SqlConnection(stringConexao);

            SqlCommand cmd = new SqlCommand("SELECT ProductName FROM Products WHERE ProductName LIKE ‘”+ _criterio +”’ ORDER BY ProductName ASC", conexao);

            conexao.Open();

            List<string> lstProdutos = new List<string>();

            SqlDataReader registro = cmd.ExecuteReader();

            while (registro.Read())

            {

                lstProdutos.Add((string)registro["ProductName"]);

            }

            return JsonConvert.SerializeObject(lstProdutos, Formatting.Indented);

        }

    }

}

Listagem 2: Web Service a ser consumido pelo JQuery

O código da Listagem 2 é bastante simples, entretanto requer um pouco de conhecimento da linguagem C#. Em linhas gerais, o que este método está fazendo é: comunicando-se com a tabela de produtos da base Northwind (este banco de dados pode ser baixado clicando aqui, retornanando os nomes de produtos para um DataReader, adicionando cada elemento do DataReader a um nó da lista e, em seguida retornando esta lista como uma string no formato JSON. Uma observação importante é o fato de incorporarmos a nosso WS a referência para o namespace “Newtonsoft.Json”.

Vamos então a verificação de nosso WS, ou seja, vamos verificar se o mesmo está se comportando da forma como esperamos. Para isso, vá a Solution Explorer e, em cima do WS clique com o botão direito do mouse e selecione a opção “View in browser” . Se tudo correu bem, sua tela deve estar semelhante aquela visualizada na Figura 4.

Descrição: http://fabriciosanchez.com.br/site/wp-content/uploads/2010/08/List4.png

Figura 4: WS executado corretamente

Bom, se nosso WS está funcionando corretamente, só nos resta então consumir esse WS em nossa página ASPX com o JQuery. Como mencionado anteriormente, iremos criar um List Suggest utilizando uma biblioteca chamada JQuery UI. Você pode efetuar o download da biblioteca gratuitamente clicando aqui.

Como iremos efetuar uma chamada assíncrona, ou seja, com postback assíncrono e iremos utilizar ajax, precisamos de um controlador de ajax em nosso ASPX. Vamos então adicionar o componente Script Manager a nossa página e dizer ao gerenciador que ele trabalhará com o WSProducts. Ao adicionar o Script Manager na página, temos o código apresentado na Listagem 3.

1

2

3

4

5

<asp:ScriptManager ID="ScriptManager1" runat="server">

        <Services>

            <asp:ServiceReference Path="~/WSProducts.asmx" />

        </Services>

</asp:ScriptManager>

Listagem 3: Script Manager adicionado na página

Estamos terminando. Nos resta agora consumir o WS de fato para que possamos exibir o List Suggest. Vamos primeiro criar um diretório em nosso projeto. Chamaremos esse diretório de UI. Dentro dele adicionaremos os arquivos da biblioteca de auto complete. Após este processo sua Solution Explorer deve estar parecida com aquela aquela apresentada na Figura 5.

Descrição: http://fabriciosanchez.com.br/site/wp-content/uploads/2010/08/List5.png

Figura 5: Solution Explorer com o JQuery adicionado

Vamos agora referenciar os arquivos adicionados à página ASPX onde consumiremos o WS. O código para a referência ao JQuery é aquele apresentado na Listagem 4.

<link href="UI/themes/base/jquery.ui.all.css" rel="stylesheet" type="text/css" />

<script src="UI/jquery-1.4.2.js" type="text/javascript"></script>

<script src="UI/ui/jquery.ui.core.js" type="text/javascript"></script>

<script src="UI/ui/jquery.ui.widget.js" type="text/javascript"></script>

<script src="UI/ui/jquery.ui.position.js" type="text/javascript"></script>

<script src="UI/ui/jquery.ui.autocomplete.js" type="text/javascript"></script>

Listagem 4: Refencias para a biblioteca JavaScript

Só nos resta agora consumir o WS com o JQuery. Para isso, adicione o código apresentado na Listagem 5 entre as tags head de nosso Web Form.

1

2

3

4

5

6

7

8

9

10

11

12

<script type="text/javascript">

        $(function () {

            $("#tags").autocomplete({

                source: function (request, response) {

                    ListSuggest.WSProducts.retornaProdutos(request.term, function (data) {

                        var json = eval(data);

                        response($.map(json, function (item) { return { label: item } }));

                    });

                }

            });

        });

    </script>

Listagem 5: Consumindo o WS com o JQuery

O código da chamada é extremamente simples. Chamamos a função autocomplete() do JQuery e, dentro dela, fazemos a chamada ao método que consome o Web Service. Simples e direto. Ao executarmos o projeto, se tudo correu bem, o resultado deverá ser semelhante aquele apresentado na Figura 6.

Descrição: http://fabriciosanchez.com.br/site/wp-content/uploads/2010/08/LIst6-1024x575.jpg

Figura 6: Resultado final do List Suggest

Bom pessoal, espero que este artigo o tenha ajudado na tarefa de criar sites com recursos avançados e que possam ajudar os usuários a encontrarem de forma otimizada os conteúdos.

Fabrício Lopes Sanchez

Fabrício Lopes Sanchez - Possui graduação em Ciência da Computação pela UNORP - Centro Universitário do Norte Paulista (2005). Obteve título de mestre junto a USP (Universidade de São Paulo) no Programa Interunidades Bioengenharia campus São Carlos. Atualmente é aluno de doutorado e pesquisador na mesma instituição e departamento. É membro regular do SpeechLab (Laboratório de Processamento de Áudio e Voz) localizado no Instituto de Física de São Carlos. Atua na área de processamento digital de áudio e voz, especialmente baseado em wavelets aplicadas à inserção e extração de watermarks em sinais de áudio e fala, análise cepstral de sinais de fala e desenvolvimento de ferramentas computacionais aplicadas ao processamento digital de sinais. Atua como desenvolvedor web na União Central Brasileira da IASD com C# e ASP.NET desde 2007. É fundador e administrador da comunidade .NET Interior.