ASP .NET - 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.

Nota:  O efeito perverso do _VIEWSTATE é a degradação do desempenho se sua página tiver muitos controles usando o _VIEWSTATE .

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 saída 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 atribuímos 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:

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

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

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Quer aprender a criar aplicações Web Dinâmicas usando a ASP .NET MVC 5 ?

 

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti