Desenvolvimento - ASP. NET

Curso ASP.NET 3.5 em VB.NET e C# - ASP.NET Ajax

A idéia do Ajax, acrônimo para Asynchronous JavaScript and XML, é permitir que apenas a parte necessária da página seja enviada e processada no servidor.

por Fernando Amaral



13 - ASP.NET AJAX

Antes de tentarmos entender o Ajax, é preciso conhecer a Web 2.0 e onde o Ajax se encaixa neste conceito.

Web 2.0

Embora a Web seja algo revolucionário e tecnologicamente inovador, na verdade hoje ela esta passando pela sua “pré-história”. Fazendo-se uma analogia, podemos pensar na revolução que foi a produção da TV em escala industrial lá pela década de 40, com baixíssima qualidade, preto e branca com a TV digital que esta surgindo nos dias de hoje. A Web atual é uma TV da década de 40.

Já muito se fala em Web 2.0, que seria a segunda geração de aplicações para Internet, onde a Internet passaria a ser a plataforma das aplicações, acessadas inteiramente através de navegadores: mais interativas, mas leves, mas dinâmicas...

Mas aonde o Ajax entra nisso tudo? O Ajax é a tecnologia que torna possível trazer muitos dos conceitos da Web 2.0 para as aplicações de fato. O Ajax é o responsável pela característica de interatividade e interfaces ricas e amigáveis da Web 2.0.

Ajax

Quando ensino ASP.NET para programadores que nunca criaram uma aplicação Web, noto que alguns tem dificuldades em entender o diferente modelo de funcionamento de uma aplicação Internet: O que estamos vendo no browser é o resultado de um requisição processada por uma aplicação no servidor. Em nosso navegador, cada vez que enviamos uma requisição de processamento, todo conteúdo é empacotado, enviado e processado pelo servidor e em seguida devolvido ao navegador, que trata de interpretar e exibir este resultado novamente para o usuário.

O problema é que, a cada requisição, a página inteira trafega entre o servidor e o cliente. Isto nos trás alguns problemas: Trafego desnecessário na rede, maior carga de processamento, tempo de espera pelo processamento da requisição.

A idéia do Ajax, acrônimo para Asynchronous JavaScript and XML, é permitir que apenas a parte necessária da página seja enviada e processada no servidor: é um modelo de funcionamento assíncrono: isto quer dizer que o usuário não precisa esperar o final do processamento da requisição para continuar executando a aplicação...note agora que o benefício é muito maior do que apenas evitar que a página pisque: é redução de tráfego, é aumento de desempenho, é maior interatividade.

Embora o acrônimo fale apenas em JavaScript e XML, temos diversas outras tecnologias envolvidas quando usamos Ajax: CSS, DOM e XMLHttpRequest. A requisição ao Ajax ao servidor é na forma de um objeto XMLHttpRequest. Após processada, o resultado em XML é processado pelo cliente, onde apenas as alterações são exibidas.

Nada de Novo

É curioso o fato de que muitas tecnologias já existentes a muito tempo, às vezes décadas, de repente se tornam a sensação do momento: Orientação a Objetos, infra-estrutura de Chaves Públicas etc. para citar apenas alguns.

Da mesma forma, o modelo de funcionamento do Ajax, através de chamadas assíncronas por javascript, não é novo. O objeto XMLHttpRequest surgiu no final da década de 90, lançado primeiro pela Microsoft, junto com o navegador Internet Explorer 5, na forma de um ActiveX. Mais tarde surgiu em outros navegadores, na forma de um objeto Java.

AJAX no ASP.NET 2.0 e Visual Studio 2005

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:

<div>

   

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

Fernando Amaral

Fernando Amaral - Certificado PMP pelo PMI, CDIA+ pela CompTia, MCP, MCAD, MCSD, MCDBA, MCT pela Microsoft. Pós Graduado em Gestão de Sistemas de Informação (UNIDERP) e Melhoria em Processos de Software (UFLA). Atualmente reside em Campo Grande, MS, onde presta consultoria, treinamentos e palestras na área de TI.
Blog:
http://www.fernandoamaral.com.br.