Criando seu primeiro Web Forms II


Qual a diferença entre Visual Basic.NET e ASP.NET ? Esta foi a pergunta que deixamos no ar no artigo : Criando seu primeiro Web Forms.

ASP.NET é uma linguagem que fica por trás de um Web Form. De forma geral parece-se com HTML com algumas tags especiais. E você não escreve código ASP.NET diretamente mas permite ao Web Form Designer criar o código para você. Funciona mais ou menos assim :

  1. Você cria um Web Form usando o Web Form Designer
  2. O Visual Basic cria uma página com código ASP.NET : um arquivo com extensão .aspx
  3. Quando o arquivo .aspx for solicitado , o servidor WEB interpreta o código ASP.NET e substitui as tags ASP.NET com os elementos HTML necessários.
  4. A versão HTML é enviada ao usuário.

Mantendo o estado da página

Um dos grandes problemas enfrentados pelas páginas ASP era manter o estado dos controles e variáveis , ou seja ,  cada vez que sua página ASP vai ao servidor e volta , todas as informações fornecidas nos controles de interface de usuário são perdidas , pois a página é recriada toda vez que o usuário a solicita. Este problema causou muitas dores de cabeça aos desenvolvedores ASP.

Felizmente com ASP.NET temos boas notícias : Com ASP.NET o servidor pode fazer este trabalho registrando as informações sobre a posição atual de controles de página em um campo oculto na página WEB . Este campo oculto então é transmitido de volta ao servidor em cada postback. Isto é feito de modo transparente e as informações são retidas para cada controle. Você pode ver as informações deste campo se examinar a página HTML em um editor de texto. Calma !!! as informações são criptografadas para evitar olhos curiosos !!!. Abaixo um exemplo :

<input type="hidden" name=" _VIEWSTATE" value="¨%$%$*&(*%+_((*&¨%}^{HGFJUCJhgfgfdf=" />

Para que isto funcione você deve definir como True a propriedade EnableViewState do controle , e , isto vale para qualquer controle que você possa modificar com código.

Quando usamos ASP.NET estamos pressupondo que o código é executado no lado do servidor (server-side) , mas os eventos de interface são realizados no lado do cliente (client-side). Assim qualquer evento do lado do cliente dispara um evento no lado do servidor , com o evento gerado , a página é enviada , processada e devolvida.  Podemos  resumir as etapas principais envolvidas como :

Vamos aproveitar o exemplo usado no artigo - Criando seu primeiro Web Forms - e fazer uma inclusão no código usado. Vamos supor que desejamos saber quantas vezes a rotina de conversão da página é executada. Para fazer isto eu vou incluir uma variável contador que irá ser acrescida no evento Click do botão de comando que faz a conversão , de forma que tenhamos uma maneira de contar os acessos à rotina de conversão da página. O valor será exibido em um controle Label que também será incluído na página. Será que vai funcionar ??? Vejamos como ficou o código :

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

     Dim polegadas As Single

   Dim contador As Integer

   polegadas = Val(txtmetros.Text) / 0.0256

   lblresultado.Text = polegadas & " polegadas "

  'código inserido para contar os acessos a página

   contador = contador +1

   lblacessos.text = contador.ToString() & " acessos a rotina de conversão "

  

End Sub

O layout da nossa página Web Form ficou assim : (lembre-se que o nome do controle é definido pela propriedade (ID) )

Se você executar a página e clicar uma , duas , três ,... vezes no botão - Converter para Polegadas - vai perceber que o contador não sofrerá alterações , sempre irá exibir o valor igual a 1 . Porque ? Por que a página é recriada a cada solicitação e a variável também é recriada e tudo começa do 'zero' a cada solicitação. Então como resolver o problema ???

Se você pensou em armazenar a variável na memória do servidor ,  considere que em um ambiente com milhares de variáveis ( e isto não é difícil de ocorrer na  internet) a memória do servidor iria se esgotar e o desempenho vai ser afetado. E agora ?

Para resolver este problema podemos usar o recurso , explicado acima , ele é chamado : State Bag ; e permite a uma página ASP.NET restaurar automaticamente o conteúdo dos controles usados na página.

Vejamos como fica o código usando o State Bag:

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

     Dim polegadas As Single

   Dim contador As Integer

   polegadas = Val(txtmetros.Text) / 0.0256

   lblresultado.Text = polegadas & " polegadas "

    contador = CType(ViewState("contador"), Integer)

   contador = contador +1

    lblacessos.text = contador.ToString() & " acessos a rotina de conversão "

    ViewState("contador") = contador

End Sub

Como funciona ?

1 -      contador = CType(ViewState("contador"), Integer)    

Esta linha de código recupera o valor da variável contador armazenada no State Bag (ViewState("contador").

2-     ViewState("contador") = contador

Esta linha de código cria o item contador na State Bag , pois cada item na State Bag é indexado por um nome , e , se ele não existe , será criado da primeira vez.

Pronto !! ao executar a página e clicar no botão para conversão veremos exibido o número de vezes que a rotina foi acessada. Beleza ???

Mas nem tudo é um mar de rosas , embora você possa usar este recurso para o formulário Web Form atual , se o usuário navegar para outro formulário Web Form teremos que usar outro método para passar as informações entre as páginas(veremos como fazer isto em outro artigo) , ou seja , o State Bag só funciona para o formulário atual.

Além disto se você abusar deste recurso a saida HTML onde o campo oculto da State Bag é armazenado pode tornar a transmissão da página lenta.

Para terminar este artigo teórico mas fundamental para que você compreenda os conceitos básicos relacionados com ASP.NET vou falar da propriedade Page.IsPostBack

Quando a página viaja do cliente para o servidor e retorna do servidor para o cliente dizemos , ou melhor os gringos dizem , que ocorreu um round-trip (chic não é mesmo..). Então quando ocorre um round-trip.(pronuncia-se : ráund-trip) ??

Um round-trip ocorre toda vez que a página é solicitada ou quando ocorre um POST (envio) de formulário. Pois bem , para saber qual a primeira vez em que a página foi solicitada ou se ocorreu um POST usamos a propriedade .IsPostBack.

Page.IsPostBack retorna um valor boleano ( True ) se a origem for um POST e retorna um ( False ) se for a primeira execução da página.

Com isto em mente podemos usar o evento Load_Page no caso do exemplo anterior para obter o mesmo resultado. Veja como ficou o código:

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

If Not Page.IsPostBack Then

    ViewState("contador") = 1

Else

    ViewState("contador") = CInt(ViewState("contador")) + 1

End If

lblacessos.Text = ViewState("contador") & " acessos à rotina de conversão"

End Sub

Como funciona ?

Verificamos se a pagina foi solicitada diretamente sem um clique de botão em : If Not Page.IsPostBack   , e então atribuimos o valor inicial igual a 1 ao State Bag. Depois é só incrementar o contador , pois a cada clique o valor para Page.IsPostBack será sempre igual a True.

Executando a página e clicando algumas vezes no botão de conversão teremos:

Veja a execução da página em : http://www.visualbasic.mat.br/webform/conversor.aspx

Por enquanto é só isto . Em breve novos artigos sobre ASP.NET , aguarde...


José Carlos Macoratti