Desenvolvimento - ASP. NET

Mantendo o estado dos dados no ASP.NET - Parte 2

Conforme detalhamos no artigo anterior, iremos falar sobre os outros meios de manter o estado das informações no ASP.NET: ViewState, Session e Application, concluindo assim, as maneiras de manter o estado das informações no ASP.NET.

por Tiago Colombo



Conforme detalhamos no artigo anterior, iremos falar sobre os outros meios de manter o estado das informações no ASP.NET: ViewState, Session e Application, concluindo assim, as maneiras de manter o estado das informações no ASP.NET.

Quando é necessário manter o estado de objetos mesmo depois do envio para o servidor devemos usar um dos objetos de estado. Muitas vezes essas informações que desejamos guardar são pertinentes apenas para a página atual, ou seja, quando desejo guardar as informções de objetos em uma mesma página e não na aplicação toda.

E é nesse momento que precisamos decidir qual objeto devemos utilizar para ter o resultado que esperamos. Abaixo irei mostrar alguns exemplos utilizando ViewState, Session e Application.

ViewState

Quando desenvolvemos uma aplicação ASP.NET, podemos observar um campo oculto no nosso código HTML chamado _VIEWSTATE, esse campo é gerado pela maioria dos formulários WEB.

O ViewState é basicamente uma lista de pares de nome = valor salva toda vez que a página é postada.

O ViewState armazena todos os dados nesse campo oculto do HTML, devido a isso ele é limitado apenas para itens que podem ser serializados, ou seja, se você deseja armazenar itens mais complexos no ViewState, você deverá converte-los em String.

Curiosidade: O campo do tipo oculto _VIEWSTATE do HTML contém uma serialização de texto compactado do estados dos controles do servidor contidos no seu formulário. O ASP.NET usa esse estado para comparar o estado de um controle com o seu estado anterior, verificando se há necessidade de acionar algum evento para o controle, por exemplo: quando a propriedade do texto é alterada.

Vamos supor que você deseja gravar a informação completa de data e hora que o usuário acessou a página e a informação completa de quando o usuário saiu da página, mas lembrando que nessa página terá alguns objetos que postam para a mesma página, ou seja, AUTOPOSTBACK. Usaremos para demonstrar, um objeto do tipo DropDownList chamado cboPostar, um Label chamado lblDataAcesso e um Button chamado btnRedirecionar (que será usado para enviar o usuário para outra página):

VB.NET

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        "No Load da página informaremos para gravar no ViewState apenas na primeira vez que acessar a página
        If Not IsPostBack Then
            ViewState("DataAcesso") = DateTime.Now()
        End If

        "E mostramos a informação do ViewState no nosso objeto Label
        lblDataAcesso.Text = ViewState("DataAcesso")
End Sub

Com isso, assim que você efetuar o acesso a página, ele guardará no ViewState a informação da data de acesso. Para certificar de que estamos com o estado dessa informação mantido, selecione algum item do seu objeto DropDowList, lembrando apenas de informar a propriedade AUTOPOSTBACK do objeto como TRUE. Você pode observar que a nossa página é postada, porém a informação da nossa data de acesso continua o mesmo.

Agora, para saber quanto tempo o usuário permaneceu na página é simples, como temos a informação inicial, basta pegarmos a informção de quando ele foi para outra página, por exemplo:

VB.NET

Private Sub btnRedirecionar_Click(ByVal sender As Object, ByVal e As System.EventArgs) 
  Handles btnRedirecionar.Click
        "Para efeito de demonstração não postaremos o usuário para a próxima página, 
		"apenas exibiremos o tempo que o mesmo permaneceu na página
        Response.Write(DateTime.Now.Subtract(ViewState("DataAcesso")))

        "Para posta-lo para outra página, basta utilizar o objeto Response.Redirect() 
		"ou Server.Transfer() ou Execute()
End Sub

No exemplo acima usamos o método Subtract do objeto DateTime para subtrairmos as duas datas, mostrando assim a duração que o usuário permaneceu na página.

Podemos também usar o ViewState para armazenar uma fonte de dados para ser usada posteriormente na nossa aplicação em outros métodos, por exemplo:

VB.NET

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        "Supomos que temos um DataSet carregado com informações do banco de dados e 
		"desejamos manter o estado do mesmo
        If Not IsPostBack Then
            ViewState("MeuDataSet") = dtsDados
        End If
End Sub

Para recuperar as informações da nossa fonte de dados, podemos fazer da seguinte maneira:

VB.NET

Private Sub sprCarregarDados()
        Try
            Dim dtsNovaFonte As New DataSet
            dtsNovaFonte = CType(ViewState("MeuDataSet"), DataSet)

            dtsNovaFonte.Dispose()
        Catch ex As Exception
            Response.Write(ex.Message)
        End Try
End Sub

Com isso, carregamos nossa fonte de dados que estava armazenada no nosso ViewState.

Podemos observar que podemos usar o objeto ViewState em vários cenários onde o objetivo do armazenamento é apenas na mesma página.

Session e Application

Resolvi falar dos dois objetos no mesmo item, pois eles dispõem de características em comum.

O objeto Session permite manter o estado dos dados no nível de usuário, ou seja, enquanto o usuário estiver conectado em uma aplicação, o mesmo compartilha de uma mesma sessão até o fim de sua visita ou se houver TimeOut da sessão (Tempo configurado para expirar a sessão caso o sistema fique ocioso), e o objeto Application mantém o estado dos dados no nível de aplicação.

Você consegue armazenar qualquer tipo de dados em Session ou Application, incluindo objetos, mas devemos analisar alguns itens antes de usarmos ambos:

  • O objeto Session armazena os dados temporariamente para cada visitante que acessa a aplicação, ou seja, toda a vez que um visitante abre uma página ASP.NET, o ASP.NET verifica se o visitante já possui um objeto Session. Se não existir o ASP.NET cria uma.
    O ASP.NET "reinicia" o tempo de vida de uma Session toda vez que o usuário requisita uma página, lembrando que o ASP.NET "destrói" o objeto Session apenas depois de um período de ociosidade da aplicação - normalmente 20 minutos.

  • O objeto Application armazena informações enquanto uma aplicação existir, ou seja, o ASP.NET cria um objeto Application na primeira vez que qualquer usuário acessar qualquer página da aplicação, e finaliza o objeto apenas quando a aplicação e reiniciada. Lembrando que cada aplicação ASP.NET possui um único objeto Application.

Normalmente usamos o objeto Session para armazenar informações que serão pertinentes para a nossa aplicação durante toda a visita do usuário, por exemplo, podemos usar o objeto Session para armazenar credenciais do usuário depois que o mesmo se autenticou na nossa aplicação:

VB.NET

Private Sub sprAutenticarUsuario()
        Try
            If txtUsuario.Text = "Tiago" And txtSenha.Text = "lcodigo" Then
                "O usuário está autenticado
                Session("ssUsuario") = txtUsuario.Text
                Session("ssEmail") = txtEmail.Text
            End If
        Catch ex As Exception
            Response.Write(ex.Message)
        End Try
End Sub
Lembrando que o exemplo que usamos acima foi feito apenas para efeito de demonstração do objeto Session, não sendo implementado nenhum tipo de segurança nas informações.

Podemos ainda armazenar objetos inteiros em Session, como por exemplo, objetos de fontes de dados como o DataSet:

VB.NET

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        "Supomos que temos um DataSet carregado com informações do banco de dados e 
		"desejamos manter o estado do mesmo na Session
        If Not IsPostBack Then
            Session("MeuDataSet") = dtsDados
        End If
End Sub

Private Sub sprCarregarDados()
        Try
            Dim dtsNovaFonte As New DataSet
            dtsNovaFonte = CType(Session("MeuDataSet"), DataSet)

            dtsNovaFonte.Dispose()
        Catch ex As Exception
            Response.Write(ex.Message)
        End Try
End Sub

Primeiramente inserimos em um objeto Session a nossa fonte de dados onde poderemos utilizá-la em qualquer momento e em qualque página na nossa aplicação.

Nota: Temos que ficar atentos no uso do objeto Session, pois o mesmo compromete o desempenho de nossa aplicação pois o mesmo fica armazenado em memória no servidor da nossa aplicação.

O exemplo bem prático que podemos mostrar sobre o uso do objeto Application seria termos um contador de usuários na nossa aplicação:

VB.NET

Sub Session_Start(ByVal sender As Object, ByVal e As EventArgs)
        Application.Lock()
        Application("QuantidadeUsuarios") = CType(Application("QuantidadeUsuarios"), Integer) + 1
        Application.UnLock()
End Sub

Adicionamos o nosso código acima no evento Session_Start do nosso arquivo Global.asax.

Podemos também simplesmente armazenar uma descrição da nossa aplicação:

VB.NET

Sub Application_Start(ByVal sender As Object, ByVal e As EventArgs)
        "Duas maneiras de criarmos um objeto Application e adicionar informações ao mesmo.
        Application.Add("NomeAplicacao", "Linha de Código - Mantendo o estado dos dados no ASP.NET")
        Application("NomeAplicacao") = "Linha de Código - Mantendo o estado dos dados no ASP.NET"
End Sub

Vale a pena ressaltar que os métodos, propriedade e descrições do arquivo de configuração GLOBAL.ASAX do ASP.NET foge do proposto deste artigo, ou seja, necessitando de um espaço apenas para falar sobre o mesmo.

Conclusão

Finalizamos aqui o que seria as maneiras de trabalharmos com o estado das informações no ASP.NET, analisamos e podemos observar que cada uma pode servir para um propósito durante o desenvolvimento de nossa aplicação.

Espero que tenham gostado.

Até a próxima,

Tiago Colombo

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.