Fernando Amaral

AJAX Parte III . Ajax Extensions

Para o Visual Studio 2005, o Ajax Extensions traz um conjunto de controles simples, que permitem a execução de chamadas assíncronas através de controles visuais, ocultando a complexidade de se trabalhar diretamente com o objeto XMLHttpRequest.

Além disso, foi lançado também um conjunto de controles, o AJAX toolkit, com um conjunto de diversas funcionalidades já prontas.

No Visual Studio 2005 e ASP.NET 2.0 o AJAX deve ser instalado a parte, através de um instalador fornecido pela Microsoft.

AJAX no ASP.NET 3.5 e Visual Studio 2008

O AJAX já é parte integrante do .NET Framework 3.5 e do ASP.NET 3.5. Os controles AJAX Extensions, ao contrário do que ocorre com o Visual Studio 2005, já vem integrados ao Visual Studio 2008 e não requerem instalação a parte.

No Visual Studio 2005 era necessário criar uma aplicação a partir de um Templates para podermos utilizar AJAX em uma aplicação, ou alguma informações deveriam ser inseridas manualmente no arquivo Web.Config.

No Visual Studio 2008 qualquer aplicação ASP.NET já esta pronta para o AJAX, não é preciso criá-la a partir de um Templates, tampouco é necessário intervenções no Web.Config.

AJAX Extensions

O poder do AJAX esta disponível em conjunto de controles na barra de ferramentas do Visual Studio:

Antes de entrarmos na parte prática, vamos qual a função de cada controle:

         ScriptManager: O controle mais importante, ele que habilita as funcionalidades do AJAX na página. Deve existir apenas um em cada web form;

  •          ScriptManagerProxy: Utilizado com a função do ScriptManager em uma página de conteúdo. No capitulo sobre Master Pages, vimos que cada página que utiliza uma página Master, é denominada página de conteúdo.  Deve funcionar em conjunto com o controle ScriptManager da página Master;
  •          Timer: Este controle deve ser utilizado para executar eventos em determinados intervalos. Veremos seu uso na prática;
  •          UpdatePanel: Talvez o controle mais importante, permite que partes de uma pagina sejam atualizados de forma assíncrona;
  •          UpdateProgress: Se a requisição assíncrona for demorada, podemos utilizar este controle para dar “feedback” ao usuário enquanto ele aguarda, seja exibindo uma mensagem ou mesmo uma imagem animada;

Exemplo prático com Update Panel

Neste primeiro exemplo veremos como é simples e rápido criar uma aplicação simples já capaz de fazer chamadas assíncronas através do ASP.NET Ajax.

Primeiramente crie uma nova aplicação ASP.NET:

 

Na web form criado pelo Visual Studio, adicione um controle ScriptManager. Este controle deve ser o primeiro da página.

Em seguida adicione um controle UpdatePanel. Este controle é um container, ou seja, dentro dele podemos colocar outros controles. É o que vamos fazer agora, adicione dentro do UpdatePanel um controle Button e um controle Label.

Seu código deverá conter os seguintes elementos:

 

 

   

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

        </asp:ScriptManager>

        <br />

   

</div>

    <asp:UpdatePanel ID="UpdatePanel1" runat="server">

        <ContentTemplate>

            <asp:Button ID="Button1" runat="server" Text="Button" />

            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

        </ContentTemplate>

</asp:UpdatePanel>

 

Hora de escrever algum código de servidor. A idéia é atualizar a hora no label. Como estaremos rodando a aplicação local e o processamento será mínimo, não teremos nenhum efeito visual das funcionalidades do AJAX, por isso, alem de atualizar o horário, vamos causar um delay no servidor.

De um duplo clique sobre o Button e escreva o seguinte código:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        System.Threading.Thread.Sleep(1000)

        Label1.Text = DateTime.Now.ToString()

End Sub

 

protected void Button1_Click(object sender, EventArgs e)

    {

        System.Threading.Thread.Sleep(1000);

        Label1.Text = DateTime.Now.ToString();

    }

Agora coloque outro Button e outro label abaixo do UpdatePanel (do lado de fora deste). De um duplo clique sobre o novo botão e escreva o mesmo código, porém escrevendo a data no label2:

Protected Sub Button2_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        System.Threading.Thread.Sleep(1000)

        Label2.Text = DateTime.Now.ToString()

End Sub

 

protected void Button2_Click(object sender, EventArgs e)

    {

        System.Threading.Thread.Sleep(1000);

        Label2.Text = DateTime.Now.ToString();

 

    }

Visualmente seu web form deverá estar semelhante a imagem abaixo:

<

O que teremos ao rodar a aplicação? O primeiro botão irá fazer uma requisição assíncrona, enviando uma informação mínima entre o postback. A segunda requisição fará um postback de toda a página.

Rode a aplicação, clique nos dois botões e observe os resultados.Se você acha que não pode observar nada diferente, preste mais atenção: Observe que quando você clicar no botão o navegador estará “carregando” a pagina (Se você usa o Internet Explorer 7, observe o ícone de carregar, que substitui o logo do IE na guia da página), aguardando o final do processamento.

Adicionando um UpdateProgress

Muitas vezes um postback pode ter uma grande carga de processamento e demorar mais do que gostaríamos. Em casos extremos o usuário pode ficar impaciente, ou até achar que ocorreu algum problema. O Controle UpdateProgress é forma de dar um feedback ao usuário enquanto ele aguarda o processamento. O Controle é também do tipo container, você decide o que vai colocar lá dentro: uma mensagem, um gif, uma animação etc. O único requisito para seu funcionamento é colocá-lo na página já preparada para o AJAX e conectá-lo a um UpdataPanel.

Vamos ver o funcionamento na prática. Crie uma nova aplicação ASP.NET, coloque um controle ScriptManager e um controle UpdatePanel. Dentro do UpdatePanel coloque um controle label e um controle Button. De um duplo clique sobre o Button e digite o seguinte código:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        System.Threading.Thread.Sleep(1000)

        Label1.Text = DateTime.Now.ToString()

End Sub

protected void Button1_Click(object sender, EventArgs e)

    {

System.Threading.Thread.Sleep(1000);       

Label1.Text = DateTime.Now.ToString();

    }

 

Note que voltamos a colocar um código para causar um atraso na aplicação, a fim de podermos ter uma visualização do efeito. Agora coloque um controle UpdateProgress, defina a propriedade AssociatedUpdatePanelID como UpdatePanel1, dentro do container do controle escreva uma mensagem como “Aguarde...processando!”:

Rode a aplicação, clique sobre o botão e observe o resultado:

Triggers

 No exemplo anterior  colocamos o botão que dispara o evento, e o label que mostra a data, dentro de um elemento ContentTemplate. Isto significa que a requisição assíncrona envio informações de ambos os controles no postback. Através de um elemento trigger podemos separar o conteúdo que será atualizado do conteúdo que dispara o evento, otimizando o postback.

Vamos ver o funcionamento na prática. Crie uma nova aplicação ASP.NET, coloque um controle ScriptManager e um controle UpdatePanel. Dentro do UpdatePanel coloque um controle label, abaixo e fora do container do UpdatePanel um controle Button. De um duplo clique sobre o Button e digite o seguinte código:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Label1.Text = DateTime.Now.ToString()

End Sub

 

protected void Button1_Click(object sender, EventArgs e)

    {

        Label1.Text = DateTime.Now.ToString();

    }

Agora devemos informar o controle que vai disparar o evento. Selecione o UpdatePanel, na janela de propriedades clique em Triggers. Esta é uma coleção de eventos que podem disparar a atualização do conteúdo do UpdatePanel. Clique em Add. Informe em ControlID Button1, em EventName Clik, conforme imagem abaixo:

Observe agora o código gerado pelo VS, compare com os exemplos anteriores:

 

<asp:UpdatePanel ID="UpdatePanel1" runat="server">

  <ContentTemplate>

        <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

        </ContentTemplate>

        <Triggers>

            <asp:AsyncPostBackTrigger ControlID="Button1" EventName="Click" />

        </Triggers>

</asp:UpdatePanel>

 

   Observe que foi criado um elemento Triggers, que aponta para o controle e o evento que dispara o postback Assíncrono. Roda a aplicação e teste o resultado.

Usando um Timer

Nos exemplos anteriores utilizamos o clique de um botão para disparar a chamada assíncrona ao servidor. O controle Timer permite que chamadas sejam realizadas automaticamente, sem a necessidade da disparada de um evento pelo usuário.

Para tal, basta colocarmos um controle Timer dentro de um UpdatePanel, e em seu evento Tick escrever o código a ser executado no servidor. Através da propriedade Interval definimos o intervalo de disparo destes eventos.

Para testarmos sua funcionalidade, crie uma nova aplicação ASP.NET 3.5, adicione ao web form criado um ScriptManager e logo abaixo um UpdatePanel. Dentro do UpdatePanel coloque um controle Label e um controle Timer. Defina a propriedade Interval do Timer em 1000 milesecundos, o que equivale a 1 segundo.  De um duplo clique sobre o controle Timer e no manipulador de evento criado escreva o seguinte código:

Protected Sub Button1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Button1.Click

        Label1.Text = DateTime.Now.ToString()

End Sub

protected void Timer1_Tick(object sender, EventArgs e)

    {

        Label1.Text = DateTime.Now.ToString();

 

    }

Rode a aplicação e observe a atualização da data a cada segundo:


Últimos artigos relacionados:
Refatoração (Refactoring) em Visual Studio 2008
Medindo a Performance de seu Código com Visual Studio Team System 2008
Code Snippets no Visual Studio 2008
Análise de Código com Visual Studio Team System 2008
.NET independente de plataforma? Uma introdução ao Mono