LOADVIEWSTATE VS LOADCONTROLSTATE

DS2T 19/11/2015 15:40:13
#454166
Criei um WebControl que herdava de um Repeater. Dentro dele, eu tinha uma propriedade que era armazenada no ControlState do controle.
Para isso, eu sobrepunha as funções SaveControlState e LoadControlState.

Funcionou perfeitamente. E tenho usado ele desde então.
Só que esses dias, surgiu a necessidade de colocar o WebControl dentro de um UserControl que era carregado dinamicamente. Nesse caso, o LoadControlState não disparava.

Sei o que vocês devem estar pensando:

Você colocou um ID no objeto para ele poder recuperar as informações ? Sim.
Você criou o objeto no evento Init pra poder ocorrer o ViewState? Sim.
Mas ele passava pelo SaveControlState? Sim... só não conseguia pegar no Load.

E agora o mais estranho de todos:
Ao invés de mandar um Override no LoadControlState e SaveControlState, resolvi sobrepor as funções SaveViewState e LoadViewState. E funcionou.

Isso que deu bug no meu cérebro! Por que no ViewState recuperou e no ControlState não?!

Esse cara passou exatamente pelo mesmo problema:

http://forums.asp.net/t/1863448.aspx?LoadControlState+is+not+getting+fired

Ele também não conseguiu entender o motivo.

Alguém aí saberia me dizer o motivo?

Valeu!
KERPLUNK 19/11/2015 16:19:57
#454167
Resposta escolhida
Por acaso você estava com ViewState desabilitada? é possível desabilitar a ViewState, mas não ControlState. ControlState é independente de ViewState, Quando você sobrepôs os métodos de gravação e leitura do ViewState, você automaticamente forçou que sejam disparados.
DS2T 19/11/2015 16:56:41
#454171
Não, a ViewState já estava habilitada. Mas eu também não tinha intenção de usar ela. Meu componente estava funcionando bem usando o StateControl, até aparecer essa situação de ser carregado dinamicamente.

O que eu achei estranho é justamente o fato do ControlState não ter como desabilitar. Ele disparava SaveControlState da maneira com que deveria, mas na hora de disparar o LoadControlState pra pegar de volta as informações, não disparava. O LoadControlState, como sabemos, não dispara se não tiver nada armazenado. O que me deixou doido é o fato do SaveControlState estar guardando as informações. Então essa questão do LoadControlState não estar disparando por falta de informação foi descartada.

Também pensei que poderia ser algum problema de Id não estar batendo. Mas debuguei tudo, e parece tudo estar Ok. Coloquei Id no usercontrol criado dinamicamente, e deixei o ClientMode como Static. Outras coisas que me fizeram pensar que não poderia ser problema de ID é:

- Outros controles no mesmo container UserControl carregado dinamicamente (textbox, checkbox) estavam funcionando o ViewState. Só esse meu webControl que não.
- Funcionou usando ViewState, então teoricamente, não poderia ser problema em encontrar o Id relativo ao controle no Load.

Usando o ViewState tá rodando show de bola. Eu só queria entender o motivo do Save/Load/ControlState não funcionar e o Save/Load/ViewState sim. Pesquisei muito, e a única referência que encontrei foi desse cara que teve o mesmo problema.

Antes, no meu WebControl, estava assim:


    [ô]Protected Overrides Function SaveControlState() As Object
[ô] Dim colecao As New Hashtable

[ô] colecao.Add([Ô]itens[Ô], Me.Estruturas)
[ô] colecao.Add([Ô]indexRemocao[Ô], Me.indexRemovido)

[ô] Return colecao
[ô]End Function

[ô]Protected Overrides Sub LoadControlState(savedState As Object)
[ô] Try
[ô] Dim colecao As Hashtable = CType(savedState, Hashtable)

[ô] Me.Estruturas = colecao([Ô]itens[Ô])
[ô] Me.indexRemovido = colecao([Ô]indexRemocao[Ô])

[ô] Catch ex As Exception
[ô] Stop
[ô] End Try
[ô]End Sub

Esse método não recupera as informações quando está dentro de um usercontrol gerado dinamicamente
(Desconsidere o fato de estar tudo comentado hehehe)


Agora está assim:


    Protected Overrides Function SaveViewState() As Object
Dim lista As ArrayList = MyBase.SaveViewState
Dim colecao As New Hashtable

colecao.Add([Ô]arrayRepeater[Ô], lista)
colecao.Add([Ô]itens[Ô], Me.Estruturas)
colecao.Add([Ô]indexRemocao[Ô], Me.indexRemovido)

Return colecao
End Function

Protected Overrides Sub LoadViewState(savedState As Object)
Dim colecao As Hashtable = savedState
Me.Estruturas = colecao([Ô]itens[Ô])
Me.indexRemovido = colecao([Ô]indexRemocao[Ô])
MyBase.LoadViewState(colecao([Ô]arrayRepeater[Ô]))
End Sub

Esse método funciona bem no caso de usercontrols carregados dinamicamente;


Só queria entender mesmo o motivo de um funcionar e o outro não.

E obrigado pela atenção Kerplunk!
KERPLUNK 19/11/2015 19:49:45
#454179
Aí você me pegou. Também não sei.
DS2T 19/11/2015 20:30:01
#454186
Realmente complicado.
E ao invés de seguir com o projeto, eu fico pensando nisso hehehehe é foda quando não consigo entender algo.
Vou deixar mais um tempo aberto, ver se alguém sabe.

Mas valeu pela boa vontade aí.
Abraços!
KERPLUNK 19/11/2015 23:00:19
#454195
Particularmente, não uso mais nem sessão nem viewstate para nada. Meus projetos web são todos estruturados com uma WebAPI e um front-end, com tudo rodando no client mesmo. Já tive muita dor de cabeça com componentes rodando no server. Muitas vezes ficava de mãos atadas por querer fazer de um jeito que a estrutura ASP.NET não permitia e em muitos casos ainda nem permite. Só vejo vantagens no uso de WebAPI. Muitos dos meus projetos desktop e até mesmo console, consomem dados da WebAPI. WebAPI aliada à Entity Framework, cria um ambiente espetacular, com facilidades dificilmente igualadas em outros ambientes.
DS2T 19/11/2015 23:17:51
#454197
Sim, comecei a perceber que a necessidade de separar melhor o código. O fato de ter que conhecer o ciclo de vida da página e suas particularidades, aliado a algumas gambiarras que sou obrigado a fazer de vez em quando por limitações da tecnologia, já estão começando a despertar a vontade de conhecer novas tecnologias.
Infelizmente, estou no meio de um projeto grande. Mas no meu próximo projeto, já não tenho certeza se farei WebForm. Nem pelo fato de ser uma tecnologia ruim, mas porque tem coisas que eu preciso fazer durante o desenvolvimento, que não considero naturais. Criar um WebControl então, até aprender foi tenso. E pensar que preciso renderizar tudo na munheca ...

Mas tá sendo um ótimo aprendizado pra mim.
Virou Guru ehein cara hahahaha da hora.
Tópico encerrado , respostas não são mais permitidas