Desenvolvimento - ASP. NET
Mantendo o estado dos dados no ASP.NET - Parte 1
Neste artigo falarei um pouco sobre os métodos para manter o estado das informações entre páginas ASP.NET (Web Form).
por Tiago ColomboNo ASP.NET, páginas (Web Form) são criadas e destruídas cada vez que o client "posta" o mesmo, por causa dessas características, variáveis declaradas no Web Form não mantém o seu valor depois que a página é exibida. Pensando em solucionar este problema, o ASP.NET dispõe de alguns meios para manter o estado destes dados, como segue abaixo:
- Context.Handler: Este objeto recebe propriedades públicas de classes de Web Form´s para serem exibidos em Web Form´s subseqüentes.
- Query strings: Informações são passadas entre páginas através da barra de navegação do Browser, sendo assim visível para os usuários, devido a isso não utilize essa forma para passar informações seguras, como por exemplo: senhas.
- Cookies: Pequenos pedaços de informações armazenados na máquina do usuário, porém o usuário pode configurar seu Browser para não aceitar esses objetos, por isso, nossa aplicação tem que prever antecipadamente se ele permite ou não este tipo de objeto, e o ASP.NET disponibiliza esta possibilidade de verificação.
- ViewState: o ASP.NET armazena itens com informações em forma de campos ocultos (hidden fields) na página.
- Session: Use este objeto para manter os dados durante a visita do usuário na aplicação, lembrando que a Session é criada na aplicação para cada usuário.
- Application: Use este objeto para manter dados disponíveis para todos os usuários da aplicação, independente do momento em que o mesmo acessar ou quando. Indicado para controlar a quantidade de usuários on-line na aplicação, mas lembrando que a Session do usuário não expira quando o mesmo fecha o browser ou sai da aplicação, mas sim quando o tempo configurado no Time-out da Session expira.
Context.Handler
O ASP.NET não permite que propriedades ou membros de um Web Form seja exibido subseqüentemente por outro Web Form, por exemplo, tenho um objeto do tipo Label na página 1 e quero ler este Label na página 2. Entretanto, quando navegamos entre páginas ASP.NET utilizando os métodos Transfer ou Execute, você pode ter acesso a propriedades "apenas leitura" (read-only) da página anterior.
Por exemplo, no código a seguir criamos uma propriedade chamada Info onde retornaremos a informação digitada num objeto do tipo TextBox chamada txtInfo.
Public Class frmTeste Inherits System.Web.UI.Page Friend ReadOnly Property Info() As String Get Return txtInfo.Text End Get End Property Private Sub btnAvancar_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAvancar.Click " Usando o método Tranfer para enviar para outra página. Server.Transfer("frmTeste2.aspx") End Sub End Class
Quando o usuário clica no botão para avançar, o mesmo é direcionado para a página frmTeste2.aspx onde esta recebe o objeto Context.Handler da página anterior, podendo assim exibir os seus valores, como mostraremos abaixo com a nossa propriedade Info.
Public Class frmTeste2 Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load If Not IsPostBack Then Dim Pagina As frmTeste Pagina = CType(Context.Handler, frmTeste) lblInfo.Text = Pagina.Info End If End Sub End Class
Deste modo você consegue transferir qualquer tipo de objeto entre páginas ASP.NET. Lembrando que o método Transfer não altera o endereço da página original (1ª) na barra de navegação do Browser, ou seja, se o usuário atualizar a página, o Browser perguntará se deseja postar a página novamente.
Outra forma de enviar dados através deste objeto seria o seguinte:
Public Class frmTeste Inherits System.Web.UI.Page Private Sub btnAvancar_Click(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles btnAvancar.Click " Armazenando os valores no objeto Context With Context.Current.Items .Add("txtInfo", txtInfo.Text) End With " Usando o método Tranfer para enviar para outra página. Server.Transfer("frmTeste2.aspx") End Sub End Class
Para retornar os valores do objeto, faremos conforme o código abaixo:
Public Class frmTeste2 Inherits System.Web.UI.Page Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load If Not IsPostBack Then With Context.Current.Items lblInfo.Text = .Item("txtInfo").ToString() End With End If End Sub End Class
Query Strings
Este método permite a você enviar informações através do endereço na barra de navegação de maneira fácil e prática, porém não segura. Em um link HTML, podemos fazer da seguinte forma:
<a href="http://www.meusite.com.br/frmPagina1.aspx?Info=LinhaDeCodigo">Envio por Query String </a>
Para receber o valor passado pela Query String seria ainda mais fácil, segue abaixo:
Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load " Verificando se a QueryString é válida If Not IsNothing(Request.QueryString("Info")) Then Response.Write(Request.QueryString("Info")) End If End Sub
Vale lembrar sempre que, para utilizar esse método você deve sempre usar pares de informações, ou seja, um identificador e o valor do mesmo. Nunca passe informações seguras, como senhas, por este método.
Cookies
Usando Cookies, você pode armazenar pequenos pedaços de informações na máquina do usuário. Este método é muito utilizado em sites onde o usuário pode criar suas preferências visuais ou até mesmo lembrar nome de usuário e senha para acessar uma área segura. Lembrando que o usuário pode bloquear a gravação de Cookies através do seu browser, dessa maneira temos que verificar se o cliente está habilitado ou não para receber Cookies.
No exemplo abaixo, nosso código verifica se o browser do cliente está habilitado ou não para armazenar Cookies:
Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load If Not IsPostBack Then " Verifica se o Browser suporta Cookies If Request.Browser.Cookies Then Dim cokSite As New HttpCookie("Site") cokSite.Value = "Linha de Código" Response.Cookies.Add(cokSite) End If End If End Sub
Agora, precisamos retornar o valor do Cookie armazenado. Segue o código abaixo:
Private Sub Page_Load(ByVal sender As System.Object, _ ByVal e As System.EventArgs) Handles MyBase.Load If Not IsPostBack Then " Verifica se o Browser suporta Cookies If Request.Browser.Cookies Then " Verifica se o Cookie que criamos existe If Not IsNothing(Request.Cookies("cokSite")) Then Response.Write(Request.Cookies("cokSite").Value) End If End If End If End Sub
Conclusão
Na primeira parte deste artigo vimos alguns meios de manter o estado das informações no ASP.NET, alguns seguros, outros fáceis de manipular e outros dinâmicos. Na próxima parte veremos outros meios de trabalhar com o estado dos dados: ViewState, Session e Application.
Até o próximo.