Desenvolvimento - ASP. NET

Utilizando AJAX com ASP.Net

O Ajax ultimamente tem ganho muita popularidade pois é uma tecnologia usada em sites como Gmail, que permite que o mesmo atualize sua Inbox sem ter que recarregar a página.

por Rodrigo Vieira



Parte 1 - Introdução

Se você é programador web e nunca ouviu falar em Ajax, é porque provavelmente uma das 4 alternativas é verdadeira:

1) Você foi abduzido por E.Ts e passou 1 ano viajando por Alfa Centauri;
2) Você cansou de Internet e resolveu passar os últimos 6 meses como missionário em Uganda;
3) Você foi um dos participantes do último Big Brother, e ficou trancado na sauna até ontem;
4) Alguma combinação das 3 alternativas acima.

Caso contrário, você já deve ter lido ou ouvido falar em Ajax, nome que ganhou muita popularidade pois é uma tecnologia usada em sites como Gmail, que permite que o mesmo atualize sua Inbox sem ter que recarregar a página. Talvez você até tenha ouvido falar na implementação dessa tecnologia que a Microsoft está prometendo para os próximos meses, chamada Atlas.

Mas enquanto Atlas não vem, o que é Ajax? E o que você tem a ganhar com isso?

Ajax é um acrônimo para “ Asynchronous Javascript And XML”, e é uma técnica relativamente antiga, mas que até 1 ou 2 anos atrás não tinha um nome próprio, era mais um “truque” na manga de programadores avançados. Essa técnica consiste em utilizar Javascript, XML e XmlHttpRequest de forma a criar páginas que executem código sem serem recarregadas, ou, para utilizar um termo mais utilizado entre os programadores ASP.Net, sem realizar postbacks . Uma outra forma de explicar isso, então, é dizer que o Ajax permite um comportamento assíncrono de sua página, ou seja, o seu programa vai executar código no servidor sem que a página fique “travada”, permitindo que o usuário enquanto isso continue utilizando-a (você já deve estar pensando o quanto isso seria útil naquela sua página que executa uma consulta ao banco de dados que leva 50 segundos, certo?).

Com tamanha popularidade, praticamente todas as plataformas de programação para web, tais como PHP, Perl e Ruby on Rails, vêm incorporando bibliotecas para suporte a Ajax, e não poderia ser diferente com ASP.Net. A implementação mais popular é chamada, obviamente, Ajax.Net , e nesse artigo vamos explorar as possibilidades oferecidas por essa biblioteca e talvez ao fim você concorde que com Ajax é possível melhorar muito a experiência do usuário em seu site.

Parte 2 – Instalando o Ajax.Net

Antes de mais nada, vamos instalar o Ajax.Net em nossa máquina. A última versão pode ser baixada aqui , e é composta pelo arquivo DLL além de um ótimo tutorial em inglês. Clique em “Download the latest DLL”, e descompacte o arquivo em algum lugar na sua máquina.

Agora abra o Visual Studio.Net 2003, ou seu ambiente de programação favorito, e crie um novo projeto ASP.Net. Antes de comecarmos a programar, precisamos adicionar uma referência ao Ajax.Net. No Visual Studio, em Solution Explorer, clique com o botão direito do mouse em “References”, e em “Add Reference”, na ba “.NET”, clique em “Browse” e selecione o arquivo ajax.dll que você acabou de descompactar.

O último passo é adicionar um httpHandler no arquivo de configuração, web.config, dentro de seção system.web :

<system.web>
    <httpHandlers>
      <add verb="POST,GET" path="ajax/*.ashx"
          type="Ajax.PageHandlerFactory, Ajax" />
    </httpHandlers>

Resumidamente, estamos adicionando um comando que permite que o Ajax intercepte chamadas ao servidor e atue quando necessário.

Pronto, agora podemos criar nossa página-teste.


Parte 3 – “Hello, Ajax”

Para começar vamos criar o indefectível “Hello World”, para vermos se o Ajax funciona mesmo.

Uma chamada Ajax é composta de 2 partes: uma parte que reside no servidor, e executa a parte “complicada” do código, por exemplo, validar um usuário, buscar algo no banco de dados, ou efetuar algum cálculo pesado, e outra parte que fica no cliente, em javascript, que executa ao servidor (para executar aquela parte mais complicada) e que também lida com a resposta vinda do mesmo, uma vez terminado o processamento. Nos bastidores ocorre um bocado de processamento de XML e utilização do objeto XmlHttpRequest, mas o bom é que isso é transparente, então você não tem que se preocupar com esses detalhes.

Vamos então criar nossa função do servidor. Entre no arquivo WebForm1.aspx.vb e adicione o seguinte código ao WebForm:

<Ajax.AjaxMethod()> _
Public Function HelloAjax(ByVal nome As String) As String
   Return "Hello from Ajax, " & nome & "!"
End Function

De diferente nesse trecho só a diretiva Ajax.AjaxMethod , que informa ao Ajax que essa função poderá ser utilizada pelo mesmo.

Também precisamos adicionar uma linha de código ao método Page_Load:

Private Sub Page_Load(…) Handles MyBase.Load
   Ajax.Utility.RegisterTypeForAjax(GetType(WebForm1))
End Sub

Esse comando adiciona automaticamente um bloco de código javascript em nossa página aspx, para que ela possa lidar com chamadas Ajax. O importante aqui é que você coloque como parâmetro do GetType() o nome da classe que você quer expor, nesse caso o nome que você deu à sua página. Como eu mantive o nome padrão dado pelo Visual Studio, minha classe é WebForm1 .

Bem, no lado do servidor era isso. Agora vamos nos voltar ao lado do cliente. Volte ao arquivo WebForm1.aspx , e adicione ao formulário uma caixa de texto ( txtNome) , um botão HTML, e uma tag div (divReposta) :

<form id="Form1" method="post" runat="server">
<asp:TextBox Runat="server" ID="txtNome"></asp:TextBox>
	<button onclick="ExecutaHelloAjax()" type="button">Alô Ajax</button>
	<br><br>
	<div id="divResposta"></div>
</form>

Agora vamos adicionar 2 funções javascript: uma que vai enviar o comando ao servidor, requisitando que ele execute a função HelloAjax, e outra que vai ficar ser invocada quando chegar a resposta e mostrar o resultado dentro da tag div . Você pode colocar esse script em qualquer lugar na sua página, mas eu costumo colocá-lo entre as tags <head> e </head>, no topo.

<script language="javascript">
function ExecutaHelloAjax()
	{
		var nome = Form1.txtNome.value;
		WebForm1.HelloAjax(nome, HelloAjax_CallBack);
	}		
			
	function HelloAjax_CallBack(response)
	{
		document.all("divResposta").innerHTML = response.value;
	}
</script>

Pronto! Agora podemos testar. Execute o programa, entre alguma coisa na caixa de texto, e aperte o botão. Repare que a resposta retorna sem que a página seja recarregada!

Caso você ache que está tudo acontecendo rápido demais pra notar qual a vantagem disso tudo, ao invés de usar os bons e velhos webcontrols, adicione uma linha lá na função HelloAjax para fazer a função dar uma “dormida” por 5 segundos:

<Ajax.AjaxMethod()> _
Public Function HelloAjax(ByVal nome As String) As String
   Threading.Thread.Sleep(5000) "faz o programa dormir por 5 segundos...
   Return "Hello from Ajax, " & nome & "!"
End Function

Repare que agora você pode escrever coisas na caixa de texto enquanto a resposta não vem, ou seja, sua página funciona de forma assíncrona.

Isso é legal, mas naturalmente que seus programas fazem coisas mais complicadas do que simplesmente saudar os usuários. Vamos então tentar algo mais interessante...


Parte 4 – Usando tipos de dados mais complexos: Classes

Além de strings, o Ajax.Net suporta tipos de dados mais complexos, tais como classes criadas por você, e também Datasets, DataTables, Decimal, Double, Boolean, Integer e DateTime.

Vamos adicionar uma classe ao nosso programa, chamada “Usuario”, com 3 propriedades: ID, Nome e Email. Adicione uma nova classe ao seu projeto, Usuario.vb:

<Serializable()> _
Public Class Usuario

#Region "variaveis reservadas "

    Private m_id As Integer
    Private m_nome As String
    Private m_email As String

#End Region


#Region "Propriedades"

    Public ReadOnly Property ID() As Integer
        Get
            Return m_id
        End Get
    End Property

    Public Property Nome() As String
        Get
            Return m_nome
        End Get
        Set(ByVal Value As String)
            m_nome = Value
        End Set
    End Property

    Public Property Email() As String
        Get
            Return m_email
        End Get
        Set(ByVal Value As String)
            m_email = Value
        End Set
    End Property

#End Region

#Region "Construtor"

    Public Sub New(ByVal ID As Integer)
        m_id = ID
        "aqui normalmente você buscaria no banco de dados,
        "mas no nosso exemplo é fixo pra simplificar
        Select Case m_id
            Case 1
                m_nome = "Jar Jar Binks"
                m_email = "jarjar@starwars.com"
            Case 2
                m_nome = "Master Yoda"
                m_email = "greendude825@hotmail.com"
            Case Else
                m_nome = "Usuario desconhecido"
                m_email = "Email desconhecido"
        End Select
    End Sub

#End Region

#Region "Funcoes publicas"

    <Ajax.AjaxMethod()> _
    Public Shared Function BuscaUsuario(ByVal ID As Integer) As Usuario
        Return New Usuario(ID)
    End Function

#End Region

End Class

A maior parte do código é feijão-com-arroz, se você já tem experiência com classes em .Net.

O que deve ser salientado é o atributo <Serializable> que adicionamos à declaração da classe, para que a mesma possa ser manipulada pelo Ajax.Net e transmitida pelo HTTP, e a função Shared (static em C#) “BuscaUsuario” que irá retornar um usuário de acordo com o ID passado, e que está marcada com o atributo AjaxMethod.

À nossa página ASPX vamos adicionar um botão para iniciar a busca ao usuário, e as funções javascript correspondentes (coloque dentro do mesmo bloco <script> que você usou para o Hello World):

function ExecutaBuscaUsuario()
{
   var id_usuario = Form1.txtNome.value;
   Usuario.BuscaUsuario(id_usuario, BuscaUsuario_CallBack);
}
			
function BuscaUsuario_CallBack(response)
{
   var usuario = response.value;
   var div = document.all("divResposta");
   div.innerHTML = usuario.ID + " - " + usuario.Nome + " - " + usuario.Email;
}
Ao formulário só precisamos adicionar um novo botão:
<form id="Form1" method="post" runat="server">
<asp:TextBox Runat="server" ID="txtNome"></asp:TextBox>
<button onclick="ExecutaHelloAjax()" type="button">Alô Ajax</button>

<button onclick="ExecutaBuscaUsuario()" type="button">Busca Usuário</button>

<br>
	<br>
	<div id="divResposta"></div>
</form>
Antes de testar, precisamos fazer mais uma coisa, que é adicionar uma linha ao Page_Load para que o Ajax.Net veja a classe Usuario:
Private Sub Page_Load(…) Handles MyBase.Load
   Ajax.Utility.RegisterTypeForAjax(GetType(WebForm1))
   Ajax.Utility.RegisterTypeForAjax(GetType(Usuario))
End Sub

Agora sim, podemos rodar:

Excelente! Com isso, podemos acessar classes de nossos programas via Ajax.

Parte 5 – Usando tipos de dados mais complexos: DataSets

Para finalizar, vou criar uma outra função que retorne usuários através de um DataSet, já que essa é uma classe bastante comum para aplicações centradas bancos de dados (o que não é muito querido por quem gosta de seguir uma arquitetura “limpa” em 3 camadas, mas isso é uma discussão à parte).

Vamos adicionar mais uma função estática à classe Usuario:

<Ajax.AjaxMethod()> _
Public Shared Function BuscaTodosUsuarios() As DataSet
    "normalmente você popularia esses dados a partir do banco
    "de dados, mas nesse exemplo vamos criar o dataset na mão
    "por questão de simplicidade
    Dim ds As New DataSet
    Dim dt As New DataTable
    dt.Columns.Add("ID")
    dt.Columns.Add("Nome")
    dt.Columns.Add("Email")

    "vamos colocar os dados dentro do dataset
    For ID As Integer = 1 To 2
        Dim row As DataRow = dt.NewRow
        Dim u As New Usuario(ID)
        row(0) = u.ID
        row(1) = u.Nome
        row(2) = u.Email
        dt.Rows.Add(row)
    Next

    "retorna o dataset
    ds.Tables.Add(dt)
    Return ds
End Function

Repare que o Ajax.Net procura manter a sintaxe similar à usada pelo .Net para DataSets, o que facilita a compreensão. No nosso formulário só precisamos adicionar um botão:

function ExecutaDataset()
{
   Usuario.BuscaTodosUsuarios(ExecutaDataset_CallBack);
}
			
function ExecutaDataset_CallBack(response)
{
   var ds = response.value;
   if(ds != null && typeof(ds) == "object" && ds.Tables != null)
   {
      var result = "";
	for(var i=0; i<ds.Tables[0].Rows.length; i++)
	{
	    var row = ds.Tables[0].Rows[i];
	    result += row.ID + ": " + row.Nome + " (" + row.Email + ")<br>";
	}
	document.all("divResposta").innerHTML = result;
   }
}

Vamos ver se funciona:

Funcionou perfeitamente! Com isso terminamos esse “tour” pelo Ajax.Net. Agora é hora de revisar as suas páginas ASP.Net e ver onde você pode tirar vantagem disso.

Divirta-se!!!

Rodrigo Vieira

Rodrigo Vieira - MCSD e MCAD, formado em Ciência da Computacão, trabalhando há 5 anos em uma empresa de telecomunicacões em Oslo, Noruega, desenvolvendo aplicativos para Intranet nas plataformas .Net e Oracle. Entusiasta de Python, Mono, Linux e software livre em geral.
Blog The Spoke:
http://br.thespoke.net/MyBlog/rodviking/MyBlog.aspx