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