ASP NET - ViewState
Fonte : DevMedia

Em linguagens de programação antigas, como o ASP clássico, ao dar submit ( ou postback ) num form e na página seguinte desse um erro qualquer ao voltar na página anterior os dados que o usuário digitou seriam perdidos.

Se você quisesse que esse problema não acontecesse no submit da página armazenaria os dados digitados na session e na página do form colocaria no parâmetro value de cada tag enviada ao servidor um response.write desses valores armazenados na session.

Raramente você veria alguma funcionalidade para limpar a session dos dados não mais usados e isso poderia causar problemas relativos ao estouro da session.

Pensando neste dilema para os desenvolvedores, a Microsoft criaram um recurso para o ASP.NET que se chama ViewState.

Com esse recurso, conseguimos manter automaticamente os valores de todos os controles do form 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 e criptografado 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 criptografados, 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 da atribuição de um valor à ViewState:
    ViewState("Nome") = "Nome"    (VB.NET)
    ViewState["Nome"] = " Nome";    C#

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 preenche o campo e clica no botão para confirmar.
Quando ele clica nesse botão (submit), 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 anterior ao postback da página para o campo.
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 que os dados armazenados no ViewState automaticamente pelo engine ASP NET.

Veja a imagem Ciclo de Vida da Requisição ASP NET

Importante : Os dados só permanecerão armazenados na página corrente. O servidor ASP NET automaticamente limpa o ViewState quando navegamos entre páginas e os dados não são mais necessários.
Se navegarmos para outra página os dados serão perdidos.

Um detalhe: temos a opção de desabilitar o ViewState em toda a página ou apenas em um (ou mais) controle específico.
Sendo assim, se o viewstate for desabilitado os dados digitados nos controles pelo usuário serão perdidos num submit/postback do form.