Capítulo 3: Handling Events and Managing State Lição 2: Using Client-Side State Management
Autor: quintelab | Publicado: 2011-05-16T17:11:00-07:00

Esta lição mostra as principais maneiras de gerenciamento de estado do lado do cliente, desta forma economizando recursos do servidor.

As principais técnicas são:
View state: O asp.net utiliza para controlar os valores dos controles entre as requisições da página.
Control state: É possível persistir informações específicas do controle sem utilizar a View State, é muito utilizado em casos de controles personalizados.
Hidden fields: Como a View State este campo fica no html mas não é renderizado para o usuário 
Cookies: Um cookie fica armazenado no navegador do usuário, para cada requisição que é enviada para o servidor o valor do cookie é enviado também, é a maneira mais recomendada quando é necessário acessar este valor em diferentes páginas do mesmo domínio.
Query strings: É um valor informado pela url da página, fica visível ao usuário na barra de endereço do browser.
Antes de explicar sobre cada uma dessas formas de persistir os dados do lado do cliente, a lição explica vantagens e desvantagens de persistir os dados do lado do servidor e do lado do cliente.

Persistindo os dados no cliente, as vantagens são:
Melhor Escalabilidade: Caso utiliza-se do lado do servidor, a cada acesso de um cliente/usuário aumenta o uso de memória do servidor. Jogando esta carga para o cliente para um irá absorver o seu acesso e irá ter um grande consumo de recurso do servidor.
Suporte por Múltiplos Servidores: Caso você necessite de uma grande arquitetura de servidores, obter as informações do cliente que estão no browser será possível por qualquer servidor sem fazer um balanceamento de carga inteligente. Ou seja caso o usuário mude de servidor no meio de uma sessão, basta o servidor acessar os dados que estão no browser.
Vantagens de persistir os dados no servidor:
 Melhor Segurança: A menos que você assine digitalmente as informações que estão no cliente, qualquer um pode alterar os dados armazenados. Ou seja nunca armazene no cliente dados confidenciais como senhas e níveis de acesso.
Redução de Banda: Os dados estando no servidor não é necessário o envio e recebimento dessas informações, os dados estando no cliente a cada requisição os dados são enviados ao servidor, utilizando banda do cliente e do seu servidor. O conselho é armazenar pequenas informações no cliente.
Qual usar? Agora é você que decide com bases nessas informações. Se você tiver uma aplicação com poucos usuário e informações sigilosas utiliza recursos do servidor. Se quer ganhar performance em sua aplicação utilize as duas formas, sabendo quando usar uma ou outra.

 View State

View State é um mecanismo do asp.net para armazenar dados de um usuário entre as requisições da mesma página. A view state não é armazenada no servidor, fica no código html da página, ela armazena estados de exibição dos controles que são acessados entre cada requisição, não consumindo assim recursos do servidor.

Caso não desabilite a View State é padrão de todas as páginas. Um exemplo, quando faz uma consulta o servidor retorna os dados e o formulário é preenchido, quando o usuário alterar algum campo e clicar no botão gravar por exemplo, caso haja um erro no envio desses dados ao servidor, as informações já digitadas não será perdidas, pois os valores armazenados na View State permaneceram.

A View State é armazenada da seguinte forma no código html:
&lt;input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE"
value="/wEPDwULLTEzNjkxMzkwNjRkZAVvqsMGC6PVDmbCxBlPkLVKNahk" /&gt;

Caso o valor seja muito grande a View State é quebrada em 2 ou quantas for necessária para armazenar&nbsp; o valor. Repare que o valor é um hash e é compactado para oferecer maior segurança e maior performance que um campo hidden comum.

Como a View State ficar no código html, o usuário consegue modificar estes valores, porém o asp.net possui um código de autenticação que consegue validar se a View State foi alterada ou não.

Caso queira maior segurança para sua aplicação é possível criptografar suas View State através de uma configuração do Web.config:

&lt;configuration&gt;
&lt;system.web&gt;
&lt;pages viewStateEncryptionMode="Always"/&gt;
&lt;/system.web&gt;
&lt;/configuration&gt;

Só que desta forma irá perder um pouco de performance pois toda vez terá que ser feito a criptografia e a descriptografia. Uma alternativa seria criptografar somente as View State que forem realmente necessárias, colocando a diretiva diretamente na página:

&lt;%@ Page Language="C#" AutoEventWireup="true" ViewStateEncryptionMode="Always"%&gt;

Como disse por padrão a View State esta habilitada em todas as páginas e para todos os controles. Devido ao trafego de envio e recebimento de informações da View State você pode optar por desabilita-la.

Caso a página seja acessada por usuário de conexões lentas e sejam páginas com um grande número de controles, a lição especifica mais de 10 controles, vale a pena pensar na hipóteses de desabilita-la. Você deve controlar os dados que são armazenados na View State, para controlar a nível de página utilize as propriedades Page.EnableViewState e Page.ViewStateMode, para controles utilize Control.EnableViewState e Control.ViewStateMode.

A propriedades ViewStateMode é nova no FrameWork 4 e só terá efeito caso a propriedades EnableViewState esteja como true. Por padrão a ViewStateMode da Página tem o valor de Enabled e a propriedades ViewStateMode dos controles herdam o valor atribuido a propriedade da página.


Caso você defina o EnableViewState  como falso a View State estara desabilitada independentemente do valor atribuido a propriedade ViewStateMode. Porém se manter a propriedades EnableViewState como verdadeira pode alterar a propriedade&nbsp;ViewStateMode para desabilitada. Em resumo trabalhe com a propriedade ViewStateMode.&nbsp;

A lição tem uma tabela que ilustra como usar essas propriedades de forma mais simples:

Desabilitar a View State de uma página, porém habilitar de um controle especifico:
Page.Enable ViewState: True, Page.ViewState Mode: Disabled, Controle.Enable ViewState: True, Control.ViewState Mode: Enabled

Desabilitar a View State de uma página, e desabilitar de um controle especifico:
Page.Enable ViewState: True, Page.ViewState Mode: Disabled, Controle.Enable ViewState: False, Control.ViewState Mode: Disabled

Habilitar a View State de uma página, porém desabilitar de um controle especifico:
Page.Enable ViewState: True, Page.ViewState Mode: Enabled, Controle.Enable ViewState: False, Control.ViewState Mode: Disabled

Habilitar a View State de uma página, e de um controle especifico:
Page.Enable ViewState: True, Page.ViewState Mode: Enabled, Controle.Enable ViewState: True, Control.ViewState Mode: Enabled

Você pode desabilitar a View State de todo o projeto diretamente no web.config:
&lt;configuration&gt;
&lt;system.web&gt;
&lt;pages enableViewState="false"&gt;
&lt;/system.web&gt;
&lt;/configuration&gt;

Para ler e escrever dados em uma View State é simples:
 

this.ViewState.Add("MyData", "some data value"); //Escrevendo
string myData = (string)ViewState["MyData"]; //Lendo 


Hidden Fields


Não tenho muito o que explicar sobre Hidden Fields, são parecidos com a View State, são campos que armazenam valores, ficam no código html da página porém não são exibidos ao usuário. Só é possível ve-los acessando o código fonte da página.


Cookies


Outra prática comum pra quem já é desenvolvedor web. Cookies armazenam valores no browser do cliente e a cada requisição ao servidor os valores são enviados. A vantagem do uso de cookies sobre o uso de View State e Hidden Fields é que os cookies podem ser acessados de qualquer página desde que esteja no mesmo dominio em que foi criado.


É possível ainda configurar seu tempo de vida e seu dominio. Escrever e ler dados de um cookie é simples:
Response.Cookies.Add(New HttpCookie("userId", userId))

E para ler o valor:
Request.Cookies("userId").Value

Exemplo de código:
// Verifica se o cookie ja existe
if (Request.Cookies["lastVisit"] != null)
&nbsp;&nbsp;&nbsp; // Encode the cookie in case the cookie contains client-side script
&nbsp;&nbsp;&nbsp; Label1.Text = Server.HtmlEncode(Request.Cookies["lastVisit"].Value);
else
&nbsp;&nbsp;&nbsp; Label1.Text = "No value defined";
// Define o valor do cookie
Response.Cookies["lastVisit"].Value = DateTime.Now.ToString();
Response.Cookies["lastVisit"].Expires = DateTime.Now.AddDays(1);

Query Strings

Outra prática comum em qualquer linguagem web. Query String é uso de parâmetros via URL. É formado de um parâmetro e seu valor correspondente. O primeiro parâmetro deve ser informado após o ponto de interrogação ?&nbsp; os parâmetros seguintes com o &amp;.


Exemplo: http://www.quintelab.com.br/bruno.aspx?id=1&amp;nome=bruno


No exemplo acima o primeiro parâmetro é o ID e o segundo é o NOME. Para ler esses parâmetros informados via QueryString basta:


string id = Request.QueryString["id"].ToString();
string nome = Request.QueryString["nome"].ToString();

Alguns cuidados devem ser tomados, os navedores suportam 2083 caracteres. E fica fácil para qualquer usuário alterar os valores contidos na url. Este caso é muito usado por exemplo para o envio de url via e-mail que quando acessadas irã ser direcionadas já para um produto especifico.