I composite Control e AJAX

è un po' che volevo fare questo post, ma causa deadline vicinissima non ho avuto il tempo.

Nell'ultimo periodo ho dovuto sviluppare parecchi Custom Control ed ho fatto uso abbastanza spinto del Framework Ajax di Microsoft riscontrando anche diversi bug (e il romano lo sa bene), ma mi sono imbattuto in una situazione un po' "strana" che non è giusto definirla bug.

Nel realizzare un Custom Control che ereditava da Composite Control (che a sua volta eredita da WebControl) ho avuto la necessità di rimuovere il tag iniziale che questo mi creava, per precisione un span.
Ora tramite la proprietà TagKey del WebControl era possibile specificare un tag di uscita diverso dallo span, ma a me non andava bene e non lo volevo proprio.
Da qui è nata l'idea di effettuare l'override dei metodi RenderBeginTag e RenderEndTag, commetanto la chiamata al base del metodo stesso.
Purtroppo questo ha scatenato un'improvvisa incompatibilità dei miei eventi contenuti all'interno del Composite Control nei confronti del framework ajax, in quanto qualsiasi evento sollevato da un linkbutton (ma è uguale per qualsiasi altro Control) presente all'interno del mio controllo, effettua un PostBack Sincrono ignorando la proprietà ChilderAsTrigger dell'update panel impostata su true, e, anche forzando il trigger a mano il postback rimane sempre asyncrono.
L'unica soluzione che ho trovato è stata quella di recuperare lo ScriptManager della pagina dal controllo e registrare a mano i controlli figli che scatenano l'evento.

Il codice mostra la procedura.

ScriptManage sm = ScriptManager.GetCurrent(Page); 
LinkButton myLinkButton = new LinkButton(); 
if(sm != null) 
{ 
 sm.RegisterAsyncPostBackControl(myLinkButton); 
}

In questo modo le chiamate sono tornate asincrone.
Questa operazione deve essere fatta prima del metodo PreRender, dopo di che non è più possibile registrare il controllo allo ScriptManager.

Ora in quel periodo lavoravo molto di fretta, magari non è la soluzione migliore o il metodo migliore per rimuovere il tag dal Composite Control, ma magari se qualcuno ha avuto lo stesso problema gli faccio risparmiare del tempo :D.

Ciauz

 

 


Comments