quinta-feira, junho 15, 2006

VIEWSTATE - ASP.NET Bug meu, Bug meu, diz-me tu quem é pior programador que eu?

Após o lançamento da minha última página, aliás com grandes alterações a nível de estruturação da programação, lancei-a para o servidor público na expectativa de não ocorrer nenhum erro. Deixem que vos diga algo importante. A pior pessoa que nós podemos pedir para testar a página, somo nós próprios, porque de maneira inconsciente não testamos da melhor maneira as partes que achamos que provavelmente tenham maior risco de erro. Peçam sempre a alguém de fora da vossa comunidade de programadores para testarem a página.

Após o envio, já estava a ocorrer um erro. A página nunca mais arrancou, ficando esta infinitamente num estado de procura, como quando esperamos que carregue uma página. Que teria acontecido? Liguei-me por FTP ao servidor remoto e reparei que a base de dados em ACCESS tinha um registo bloqueado (podemos sabe-lo se estiver no mesmo local um ficheiro do tipo .LDB). Estranho. O pior é que não havia maneira de apagar esse ficheiro pois dava sempre o erro de estar a ser usado por um outro processo. A única forma era drástica. Telefonar para o departamento técnico do alojamento e pedir-lhes para REINICIAR O IIS para libertar o serviço !!!!ehe...Simpáticos os tipos aliás. Isto é perigoso para eles porque iriam não só desactivar a minha página como também desactivar todas as outras que estavam ligados com aquele IIS. Após desactivarem os serviços lá consegui colocar a página no ar. O que teria acontecido??

De facto as alterações na página relativamente a todas as outras que fiz, tem a ver com o método LoadControl do controlo Placeholder. Agora em vez de ter varias páginas com usercontrol tenho uma página que faz o load dinamicamente do controlo. Isto provoca algumas alterações nos ViewStates das páginas. Se estes não forem guardados na variavel local , não poderei ter certas interacções com o usercontrol usado, pois o viewstate não é guardado. Resolução??

If Not Me.ViewState("ctrlPath") Is Nothing And Request.QueryString("data") = "" Then
PlaceHolder1.Controls.Add(LoadControl(Me.ViewState("ctrlPath")))
endif


Imaginemos a seguinte situação. Temos uma página que dinamicamente carrega um controlo responsável pela pesquisa no site. Esse controlo tem um botão que despoleta eventos. Carregamos a página juntamente com o controlo e carregamos no botão para pesquisar por exemplo, em produtos. Fantástico. Se nós não guardasse-mos o viewstate desse controlo a página provavelmente nem carregaria se fosse chamada de outro usercontrol. Se não guardasse o viewstate da página e a carregasse novamente com o veiwstate guardado anteriormente, então nada acontecia e seria como se ela carregasse de novo.

Sem comentários: