Como aceder ao viewstate através de uma classe quando não podemos passar uma referência da mesma
Tive recentemente um problema ao tentar manter uma datatable no viewstate. Tudo seria fácil se apenas tivesse que aceder ao viewstate de dentro da classe da própria página. Infelizmente esse não foi o caso. O que eu fiz foi criar uma classe que seria usada como business object (ou por outras palavras como source para um object datasource). Infelizmente como a instância da minha classe é criada pelo póprio objectdatasource não tenho como passar à minha classe uma instância do viewstate da página (ou de qualquer outro controlo).
Após alguma análise com o reflector deu para perceber que o viewstate é herdado do webcontrol e que é protected, o que significa que só é acessível internamente por uma classe que herde do webcontrol. Assim o que fiz foi, em primeiro lugar, criar uma classe que herda de System.Web.UI.Page e fazer um shadow da propriedade viewstate para tornar a mesma pública. Em seguida dentro da classe que serve de business object fui buscar a instância da página actual através da classe httpcontext.current.currenthandler e converti para a minha classe que deriva da System.Web.UI.Page para assim obter o viewstate que me permitiu gravar a datatable entre postbacks.
Se alguém se deparar com o mesmo erro estou disposto a mostrar alguns exemplos. Entretanto espero que isto poupe algumas horas a alguem pois a mim certamente o teria feito. Isto só porque teimei em não gravar a datatable na session para não ocupar memória :p