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 Colombo



No artigo de hoje falarei um pouco sobre os métodos para manter o estado das informações entre páginas ASP.NET (Web Form). O ASP.NET disponibiliza várias formas de conseguir manter o estado das suas informações, dependendo do que e onde você precisa armazenar estas informações.

No 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.

Tiago Colombo

Tiago Colombo - Analista de Sistema, certificado MCAD.NET (Microsoft Certified Application Developer) e atualmente trabalha com projetos na plataforma .NET. Especializando-se em Sistemas de Banco de Dados no IBTA (Instituto Brasileiro de Tecnologia Avançada), trabalha com .NET desde 2003 e têm atuado em diversos projetos de todos os portes.