Olá pessoal, neste artigo veremos os conceitos e a sintaxe para o uso de um recurso implementado dentro do ASP.NET, que se chama ViewState.

Em linguagens de programação antigas, como o ASP clássico, por exemplo, se quiséssemos armazenar valores em uma página durante um PostBack, teríamos que digitar várias linhas de código para que desse certo.

Pensando neste dilema para os desenvolvedores, a Microsoft criou um recurso para o ASP.NET que se chama ViewState. Com esse recurso, conseguimos manter automaticamente os valores de controles no servidor entre um PostBack e outro da página. Com isso mantemos a persistência dos dados em determinada página de nossa aplicação.

O ViewState é simplesmente um campo oculto ao usuário. Se você rodar uma aplicação ASP.NET sem qualquer controle verá que é criado um campo oculto para o armazenamento do ViewState:

<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" 
value="/wEPDwULLTE2MTY2ODcyMjlkZLjNDeX4oCKahG2SLd9PjlAn89xK" />

Note que os dados exibidos na propriedade Value estão encriptografados, por questões de segurança. De qualquer forma, não devemos usar o ViewState para manter dados sensíveis à nossa aplicação.

Podemos ainda adicionar valores manualmente ao ViewState, lembrando que você só conseguirá recuperá-lo entre um PostBack e outro de uma mesma página. Abaixo a sintaxe (na ordem, em VB.NET e em C#) da atribuição de um valor à ViewState:

ViewState("Nome") = "Wellington Balbo"
ViewState["Nome"] = " Wellington Balbo";

Como um exemplo prático de como o ViewState funciona podemos imaginar o seguinte: quando, por exemplo, temos um TextBox para o usuário digitar o nome dele, ele digita e clica no botão para confirmar. Quando ele clica nesse botão, a página sofre um PostBack, é enviada ao servidor, volta e, aquele valor digitado, permanece no TextBox. Ou seja, não foi preciso ser feito nenhuma implementação no TextBox para recuperarmos o valor digitado antes do PostBack. Como dito anteriormente, em ASP clássico geralmente o valor é perdido quando isso acontece.

Neste exemplo citado, nosso campo oculto armazena o nome digitado, a página sofre o PostBack e, quando voltamos à página, o campo permanece com o nome inalterado, mantendo o princípio que chamamos de Persistência dos Dados.

Lembrando mais uma vez (sim, insisto nisso!) que os dados armazenados no ViewState só permanecerão armazenados na mesma página em que ele está sendo usado. Outra coisa: temos a opção de desabilitar o ViewState em toda a página ou apenas em um (ou mais) controle específico.

Exemplo prático

  • Crie um projeto do tipo Web Application, em C# e dê o nome de ExemploViewState.
  • Em nossa Default.aspx, que foi criada automaticamente pelo Visual Studio, adicione 1 TextBox, 2 Buttons e  1 Label.
  • Use os seguintes ID’s nos controles: txtNomebtnSalvarbtnLer e lblNome.
  • A idéia é a seguinte: digitaremos um nome qualquer no campo texto e, ao clicarmos no botão Salvar, ele irá armazenar o valor digitado no ViewState e a página sofrerá um PostBack automático.
  • Ao clicarmos no botão Ler, será exibido em nosso Label o nome digitado anteriormente.

Dito isso, vá ao código-fonte de nossa Default.aspx e crie o método para Salvar, digitando os códigos a seguir:

private void Salvar()
{
    try
    {
        ViewState["Nome"] = this.txtNome.Text;
        this.txtNome.Text = string.Empty;
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

Simples, né? Dou um nome qualquer ao ViewState, que irá receber o que for digitado dentro de txtNome, depois limpo o TextBox, para dar a impressão ao usuário que a página realmente sofreu atualização.

Agora faça a chamada deste método no botão Salvar, dando 2 cliques nele, para que entremos em seu evento Click:

protected void btnSalvar_Click(object sender, EventArgs e)
{
    Salvar();
}

Agora crie o método do botão Ler, que irá recuperar as informações que foram digitadas pelo usuário e armazenadas quando o mesmo clicou em Salvar:

private void Ler()
{
    try
    {
        this.lblNome.Text = "Valor armazenado: " + ViewState["Nome"].ToString();
    }
    catch (Exception ex)
    {
        throw new Exception(ex.Message);
    }
}

O que fiz foi atribuir ao meu Label o texto “Valor armazenado:”, concatenado com o valor do ViewState, convertido para String, que é o mesmo tipo do Label.

Chame este método no botão Ler:

protected void btnLer_Click(object sender, EventArgs e)
{
    Ler();
}
 

Agora aperte F5 para compilar nossa aplicação, irá aparecer uma mensagem perguntando se você deseja modificar o Web.Config para permitir a compilação, apenas clique em OK e aguarde.

Digite um nome qualquer e clique em Salvar, perceba que a página será atualizada. Agora clique em Ler e observe:

Valor armazenado no ViewState

Perceba que o nome que você digitou anteriormente foi armazenado no ViewState.