ASP.NET 2.0 - PostBack e ciclo de vida de uma página


O modelo de execução de páginas na ASP.NET difere de forma considerável do modelo anteriormente usado pela ASP. Ao invés de executar blocos de código em estágios apropriados do envio da página para o cliente, ASP.NET trata a página como uma classe e compila a mesma para o código MSIL(Microsoft Intermediate Language).

O código é armazenado no disco e então executado pelo run time Just-In-Time da .NET Framework quando for requisitada pelo usuário. Isto permite um melhor desempenho e novas técnicas de programação.

Uma das características mais importantes da ASP.NET é a habilidade de declarar controles que rodam no servidor e a possibilidade de efetuar o postback para a mesma página.

Quando uma página ASP.NET é executada ela entra em um ciclo de vida no qual realiza uma série etapas de processamento que incluem: a iniciação, instanciação de controles, restauração e manutenção de estado, execução de código de tratamento de eventos e renderização.

Em uma página ASP.NET os controles e campos de formulários podem ser declarados para rodar no servidor e o servidor simplesmente posta a página de volta para ele mesmo e realiza toda a validação , exibição e realização de ações. A vida ficou mais fácil para o desenvolvedor pois antes era preciso criar páginas adicionais para efetuar a validação e o processamento.

De uma forma simplificada podemos dizer que quando a primeira requisição para uma página ocorre ela é criada(construtor) e o seu evento OnInit() é chamado, logo em seguida o evento page_Load() e acionado e ela é devolvida para o navegador do usuário e a página é destruída. O usuário recebe a página navega e ao final efetua alguma ação clicando em um botão , link, etc. Isto exige uma nova requisição ao servidor para execução do código que porventura possa existir na página. Essa requisição é o que chamamos postback.

Quando o servidor recebe o postback a página é criada o evento Oninit() é executado e os valores dos controles e variáveis da página é recuperado (através de um recurso chamado ViewState) voltando o estado que a página tinha na requisição anterior.

Ai o evento Page_Load é chamado e o qualquer código presente neste evento é executado e por último o evento do controle que foi clicado é executado, o conteúdo da página é devolvido para o navegador do usuário e a página é destruída.

A seguir temos a sequência de estágios pelo qual passa uma página ASP.NET quando executada:

Estágio Evento da Página Método
Page - iniciação Init  
View state - carga   LoadViewState
Postback - procesamento de dados    método LoadPostData em qualquer controle que implementa a interface   IPostBackDataHandler interface
Page - carregamento - (Load) Load  
Postback - notificação de mudança   RaisePostDataChangedEvent em qualquer controle que implementa a interface   IPostBackDataHandler
Postback - tratamento do evento Qualquer evento postback definido pelos controles método RaisePostBackEvent em qualquer controle que implementa a interface  IPostBackEventHandler 
Page - pre-renderização PreRender  
View state - salvando   SaveViewState
Page renderizando   Render
Page descarregando (Unload) Unload

Alguns controles WebForms sempre irão causar um postback quando acionados ; outros terão que ser configurados para que tenham o mesmo comportamento .

Um postback sempre envolve a obtenção de uma nova página do servidor e isto pode fazer com que as coisas fiquem um pouco lentas na sua aplicação. Por isto a propriedade AutoPostBack  dos controles esta ajustada para False de maneira a 'retardar'  os eventos de controle até que um controle próprio(Button)  inicie um postback. (Você só deve alterar esta propriedade para situações em que realmente precisar.)

Nota: A página possui uma propriedade que informa se a requisição é um postback ou se é a carga inicial.

Para evitar esta sobrecarga os eventos dos controles se comportam diferentemente de como agem nos formulários Windows. Assim o evento Change do controle TextBox ocorre quando um usuário move para um controle diferente na página depois de modificar a caixa de texto e não como nos formulários Windows , quando este evento ocorre sempre que qualquer tecla seja pressionada. Pela mesma razão os eventos de Mouse (MouseMove e KeyPress) não estão implementados nos controles WebForms.

Quando um controle é declarado para rodar no servidor, um VIEWSTATE é criado para recordar o ID do controle e o método a chamar quando uma ação for realizada. Vejamos um exemplo:

Abra o Visual Web Developer Express e crie um novo web site chamado postBackNet. Selecione a página Default.aspx e no modo Design inclua um controle LinkButton na página.

A seguir inclua no evento Click o seguinte código:

Protected Sub LinkButton1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles LinkButton1.Click
      Response.Write("O linkButton foi clicado...")
End Sub

Após isso acionando o modo Source iremos ver o seguinte código na página Default.aspx:

<%@ Page Language="VB" AutoEventWireup="false" CodeFile="Default.aspx.vb" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>ASP.NET</title>
</head>
<body style="font-size: 12pt; font-family: Times New Roman">
<form id="form1" runat="server">
  <div>
     <asp:LinkButton ID="LinkButton1" runat="server">Clique Aqui</asp:LinkButton>
  </div>
</form>
</body>
</html>

Esta é uma página muito simples, foi declarado somente um controle LinkButton para rodar no servidor (veja a declaração :runat="server") e foi definido um ID para o controle, no caso eu usei o ID padrão: LinkButton1. Também foi definido um código associado ao evento Click do controle chamado LinkButton1_Click para rodar quando o link for clicado na página.

Note que a declaração do controle no formulário esta no interior de uma declaração de formulário : <form id="form1" runat="server"> que também irá rodar no servidor. Vamos agora salvar esta página e executá-la pressionando Ctrl+F5.

O resultado obtido será apresentação ao usuário da seguinte página:

Dê uma olhada no código fonte desta página clicando na opção Exibir->Código Fonte :

Note que o link chama uma função JavaScript chamada __doPostBack quando clicado. Você não escreveu esta função , ela foi gerada pela ASP.NET e incluída automaticamente na página. Ela submete a página a ela mesma e aceita dois argumentos:

  1. eventTarget - o controle efetuando a submissão;
  2. eventArgument - qualquer informação adicional para o evento;

Para o nosso caso o nosso controle linkbutton gerado esta dizendo para função JavaScript que o controle submetendo o formulário é reconhecido pelo ID=LinkButton1 e o segundo argumento não possui informação alguma.

Perceba também que a função JavaScript esta definindo 2 campos de formulários ocultos(hidden) com os argumentos : __EVENTTARGET e __EVENTARGUMENT. Quando o formulário é submetido de volta ao servidor , o servidor lê estes dois campos ocultos e decide o que submeter ao formulário qual a ação necessária realizar. No nosso caso o servidor irá determinar que o LinkButton execute a ação e irá executar o método LinkButton1_Click.

A string VIEWSTATE é armazenada em um campo oculto no HTML gerado para a página , ela é um conjunto de informações sobre a página mesclado com um HASH gerado no servidor para proteger a informação (Você pode decodificar esta string usando o ViewState Decoder). Então cada componente da página salva o seu estado no ViEWSTATE de forma que para cada postback o componente possa voltar a ser exibido na forma original sem necessitar de uma nova inicialização.(Você pode usar o ViewState para armazenar dados de sua aplicação desde que eles sejam aplicáveis somente a página.)

È muito importante você compreender estes conceitos básicos pois desta forma você pode escrever o seu código nos estágios apropriados para atingir o objetivo que você deseja sem sobressaltos.

Eu sei é apenas ASP.NET, mas eu gosto...

Tito 3:3 Porque também nós éramos outrora insensatos, desobedientes, extraviados, servindo a várias paixões e deleites, vivendo em malícia e inveja odiosos e odiando-nos uns aos outros.

Tito 3:4 Mas quando apareceu a bondade de Deus, nosso Salvador e o seu amor para com os homens,

Tito 3:5 não em virtude de obras de justiça que nós houvéssemos feito, mas segundo a sua misericórdia, nos salvou mediante o lavar da regeneração e renovação pelo Espírito Santo,

Tito 3:6 que ele derramou abundantemente sobre nós por Jesus Cristo, nosso Salvador;

Tito 3:7 para que, sendo justificados pela sua graça, fôssemos feitos herdeiros segundo a esperança da vida eterna.

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

 

             Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter
 

Referências:


José Carlos Macoratti