Eliminando o ViewState de Páginas ASP.Net
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.
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
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.