ASP .NET - Web Forms - Fundamentos - View State (revisão)


O Framework Web Forms foi introduzido com a ASP.NET 1.0, desde então, inúmeros sites foram construídos e implantados com sucesso usando esta plataforma.

Essencialmente, o Web Forms foi projetado para abstrair as complexidades do Hypertext Markup Language (HTML) e do protocolo Hypertext Transfer Protocol (HTTP) para tornar o desenvolvimento web mais parecido com o desenvolvimento das aplicações Windows Forms.

A seguir temos algumas características das aplicações Web Forms :

- O desenvolvedor é apresentado a uma interface que se parece com uma página web.
- Os controles Web são arrastados para esta superfície de design.
- As propriedades são definidas na página e nos controles.
- O código é escrito para manipular a página, controles e dados associados;

Usando o Visual Studio ou o Visual Web Developer Express podemos criar rapidamente uma aplicação para web usando a tecnologia Web Forms. Um rico conjunto de controles internos e de controles de terceiros ajuda a reduzir a tarefa de desenvolvimento e a ganhar produtividade.

Mas nem tudo são flores no mundo Web Forms...

Este desenvolvimento rápido (RAD) de aplicações web tem o seu custo.

Os Web Forms e e os controles associados geram de forma automática código HTML e JavaScript, e, às vezes este código gerado não satisfaz a todas as suas necessidades.

Para piorar, diferentes navegadores renderizam o mesmo HTML de diferentes formas e traduzem o JavaScript de forma diferente, particularmente na sua interação com o DOM (Object Model). Outro problema comum é que uma página é renderizada corretamente em um navegador e incorretamente em outro.

Dessa forma ao utilizar Web Forms fica difícil modificar a saida HTML ou JavaScript, e, isso pode ser um problema quando você usa mais de um navegador.

Se você tiver problemas com o HTML terá problemas em dar suporte alguns navegadores. Por esta razão, os desenvolvedores web devem aprender o máximo que puderem sobre HTML, Cascading Style Sheets (CSS), e HTTP. Assim, embora os Web Forms sejam um avanço, ele não o livra da responsabilidade de entender as tecnologias que ele pretende abstrair. Na versão 4.0 da ASP .NET houve uma série de melhorias neste aspecto, dentre as quais citamos:

- Um melhor tratamento do ViewState que permite aos usuários uma maior flexibilidade sobre os controles que participam no ViewState;
- O arquivo web.config foi simplificado;
- Um novo modelo de projeto Web (Web Project) fornece maior funcionalidade;
- As Transformações no web.config o tornam mais fácil de implantar em um novo ambiente;

View State

Por padrão, a web e seu protocolo de transporte subjacente (HTTP) não possuem estado. Isto significa que, por padrão, cada requisição não se lembra de nada sobre qualquer requisição anterior. A ASP.NET introduziu o View State como uma forma de manter o estado entre as páginas de uma aplicação web.

O View State trabalha criando de forma automática entrada extra, escondida dentro de um formulário HTML. Para salvar o estado dos campos submetidos de uma página, a ASP .NET codifica os dados do View State em uma string única e define o valor deste campo oculto para esta string. Este campo é criado no servidor e enviado para o cliente com o resto da página web.

Crie um novo projeto do tipo ASP .NET Empty Web Application com o nome ViewStateExemplo e inclua um formulário Web Form
com o nome Default.aspx no projeto

Não coloque nada no formulário e rode a aplicação.

Se você espiar o código fonte deverá visualizar algo parecido com o seguinte:

<html xmlns="http://www.w3.org/1999/xhtml">
<head><title>

</title></head>
<body>
    <form method="post" action="Default.aspx" id="form1">
<div class="aspNetHidden">
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwULLTE2MTY2ODcyMjlkZI2ZWFeR12zzZ/HYeru1y0VDUoml9E3ECU0DPjRXIgmY" />
</div>

    <div>
    
    </div>

    </form>
</body>
</html>
Observe o campo __VIEWSTATE e o valor gerado : /wEPDwULLTE2MTY2ODcyMjlkZI2ZWFeR12zzZ/HYeru1y0VDUoml9E3ECU0DPjRXIgmY (mesmo sem termos usado nenhum controle.)

O View State é muito conveniente pois resolver o problema da falta de estado do protocolo HTTP pois cada componente colocado em uma página ASP.Net vai salvar seu estado no ViewState, e que cada vez que ocorrer um postback esse componente vai poder ser exibido novamente exatamente como estava antes, sem precisar fazer nova inicialização ou trazer os dados novamente do banco de dados. (Se você desativar a propriedade EnableViewState do controle isso não vai ocorrer.)

Esta conveniência tem um preço. Os dados codificados são submetidos a cada vez que o formulário for enviado e é devolvido para o navegador com cada resposta. Se você tem um monte de dados armazenados em um View State os dados podem ocupar muita memória, afetando o desempenho da comunicação entre o cliente e o servidor.

Usando uma versão anterior do ASP.NET, um desenvolvedor poderia ligar ou desligar o View State a nível de página ou ao nível de controle. Antes da ASP.NET 4, basicamente você tinha três opções para ativar o View State:

A ASP.NET 4 fornece duas propriedades relevantes para controlar o View State: ViewStateMode e EnableViewState.

Apenas a propriedade ViewStateMode é nova na versão 4, mas as duas propriedades trabalham em conjunto.

A propriedade EnableViewState já estava presente desde a primeira versão da ASP.NET. Ela pode ser configurada para toda uma página, ou para um único controle, e pode ser definida como True ou False. A propriedade EnableViewState não liga o estado de exibição para os controles. Em vez disso, ele determina se View State pode ser transformado para um controle, e para os controles abaixo dele na hierarquia de controles.

Uma propriedade ViewStateMode de controle liga ou desliga o estado de exibição, mas só se EnableViewState for True. A propriedade ViewStateMode pode ser ativada ou desativada explicitamente ou pela herança desta propriedade de seu recipiente pai. Configurando um atributo View State de uma página ou de um controle para False desativa o View State naquela pagina/controle de todos os controles contidos nele.

Nas versões anteriores da ASP .NET a unica forma de ativa/desativar o View State nos controles era definir EnableViewState="True" na pagina e definir EnableViewState="False" nos controles para os quais você não desejava ter a sobrecarga de ter que passar o View State entre o cliente e o servidor.

Voce pode definir ViewStateMode como um atributo de uma pagina ou controle ou você pode fazer isso via codigo. O valores permitidos são:

- Enabled - Ativa o View State para o controle
- Disabled - Desativa o View State para o controle
- Inherit - Diz à ASP.NET para definir o ViewStateMode do recipiente pai do controle. Este é o valor padrão para um controle de usuário.

A propriedade ViewStateMode só é relevante se EnableViewState for definida como True para um controle ou pai do controle.

Se EnableViewState for True, o ViewStateMode pode estar ligado ou desligado para um dado controle. Ligando o View State, qualquer dado associado com o controle será codificado no servidor, salvo com uma entrada oculta e renderizado para o cliente e assim será submetido na próxima vez que o formulário for submetido.

Abaixo temos um trecho de código onde ativamos o EnableViewState para a página e ativamos o ViewStateMode para o controle TextBox.

<%@ Page …
EnableViewState=”True” ViewStateMode=”Disabled” %>
<asp:Label runat=”server” Text=”Informe o nome:” ID=”nome” />
<br />
<asp:TextBox runat=”server” ID=”NomeUsuario” ViewStateMode=”true” />

Dessa forma vimos que o ViewState é uma string armazenada em um campo oculto, dentro do HTML gerado para a sua página.

A string codificada está em Base64, e pode ser decodificada usando uma ferramenta como o ViewState Decoder.

Usando a ferramenta para decodificar o View State do exemplo teremos:

Uma forma de evitar que o View State sobrecarregue a página é removê-lo da página.

Você pode fazer isso e ainda sim permitir que os componentes mantenham o seu estado.

Como ????

Basta gravar o View State em outro lugar como um banco de dados, no cache , em um arquivo xml, em um arquivo texto, ou qualquer outro local a partir de onde possamos recuperar a informação sobre o View State.

Ja existem os métodos SavePageStateToPersistenceMedium e LoadPageStateFromPersistenceMedium que fazem exatamente isso: salvam e recuperam o view state. Assim suas páginas podem ser carregadas mais rapidamente.

Uma alternativa ao modelo Web Forms é o modelo ASP .NET MVC que dá ao desenvolvedor maior controle sobre a aplicação.

Veja a seção ASP .NET MVC do site.

João 5:25 Em verdade, em verdade vos digo que vem a hora, e agora é, em que os mortos ouvirão a voz do Filho de Deus, e os que a ouvirem viverão.
João 5:26
Pois assim como o Pai tem vida em si mesmo, assim também deu ao Filho ter vida em si mesmo;

João 5:27
e deu-lhe autoridade para julgar, porque é o Filho do homem.

Referências:


José Carlos Macoratti