Eliminando o ViewState de Páginas ASP.Net

Escrito em 19 de julho de 2007 em Asp.Net por Leonel Togniolli

Quando iniciei a explicação sobre o funcionamento do ViewState, mostrei que conforme a complexidade de uma página aumenta, a informação armazenada no ViewState cresce de forma correspondente. Se chegar o ponto que o ViewState está em um tamanho que prejudique o carregamento de páginas, e não existe mais nenhum controle que possa ter seu ViewState desabilidade, ainda há uma solução: É possível remover o ViewState completamente da página.

Como podemos remover o ViewState completamente e ainda permitir que os componentes mantenham seu estado? Simples, podemos gravar o ViewState em algum outro local – um banco de dados, ou talvez em algum outro recurso de persistência que o ASP.Net nos disponibilize. Neste caso, vamos utilizar o Cache.

Páginas ASP.Net possuem dois métodos que permitem o programador redirecionar o conteúdo que está no ViewState para outro lugar. Esses métodos são SavePageStateToPersistenceMedium e LoadPageStateFromPersistenceMedium. Partindo desses métodos, é bem simples imaginar o que deve ser feito: no primeiro salvamos os dados no Cache, e no segundo buscamos esses dados. Precisamos de uma chave única para os ViewStates de usuários diferentes e páginas diferentes não sejam misturados. Vamos utilizar uma GUID. A declaração desses métodos dentro da sua página fica assim:

strict protected
  function LoadPageStateFromPersistenceMedium: System.Object; override;
  procedure SavePageStateToPersistenceMedium(ViewState:
		System.Object); override;

E a implementação deles, assim:

const
  HiddenFieldViewState = 'ChaveViewState';

procedure TWebForm1.SavePageStateToPersistenceMedium(ViewState: TObject);
var
  ChaveViewState: string;
begin
  ChaveViewState := Guid.NewGuid.ToString;
  Cache.Add(ChaveViewState, ViewState, nil,
    System.DateTime.Now.AddMinutes(Session.Timeout),
	Cache.NoSlidingExpiration,
    	CacheItemPriority.Default, nil);
  RegisterHiddenField(HiddenFieldViewState, ChaveViewState);
end;

function TWebForm1.LoadPageStateFromPersistenceMedium: System.Object;
var
  ChaveViewState: string;
begin
  ChaveViewState := Request.Form[HiddenFieldViewState];
  Result := Cache[ChaveViewState];
end;

Veja como geramos um novo GUID, e salvamos ele em um campo oculto no formulário para podermos recuperar o ViewState depois.

Esta alteração tem uma vantagem óbvia: páginas ficam menores e mais rápidas de serem baixadas pelos visitantes da sua página. Algumas desvantagens aparecem, uma delas sendo o fato que toda essa informação está sendo gravada  na memória do servidor pelo tempo determinado pelo timeout da sessão. Por esse motivo, a informação que antes estava no ViewState e antes era válida mesmo que o usuário mantivesse a página aberta por dias e dias, e só então enviasse o formulário, agora tem uma data de expiração determinada.

O cache não é o único lugar para se manter o ViewState, mas o mais prático por ser esvaziado automaticamente após determinado tempo mesmo que o visitante feche o browser e nunca mais visite sua página. É fácil adaptar esse método para salvar informações em um banco de dados ou algum mecanismo parecido.


2 comentários em 'Eliminando o ViewState de Páginas ASP.Net' »

Assine os comentários usando RSS ou faça um TrackBack para 'Eliminando o ViewState de Páginas ASP.Net'.

[-]
[+]
Toninho Nunes disse,

Em 03 de outubro de 2007 às 20:12

Sua dica funcionou, minhas páginas asp.net que não precisavam manter dados estavam carregando o meu viewstate do form, coloquei os procedimentos acima e pude verificar maior performance na carga da página.

Toninho Nunes

 
[-]
[+]
Guilherme disse,

Em 19 de abril de 2010 às 12:59

Essa sua implementação deve ser inserida aonde? No .aspx ou no .cs??

Eu tenho uma página que tem 10 viewstates, e to com receio que ela fique lenta. Gostaria de implantar essa sua dica, mais não consegui.

Pode me ajudar?

Obrigado.