Blog Stats
  • Posts - 171
  • Articles - 1
  • Comments - 197
  • Trackbacks - 5

 

Persistenza del viewstate nei controlli di tipo CompositeDataBound

La crezione di controlli custom per ASP.NET mi ha sempre appassionato e fin dalla versione 1.1 di ASP.NET per vari progetti web che ho dovuto affrontare, mi sono sempre "costruito" la mia libreria di controlli personalizzata.

Si tratta spesso di estendere i controlli che il framework di ASP.NET ci mette a disposizione, ma per le esigenze "più estreme" è necessario a volte sviluppare ex-novo.

Con ASP.NET 2.0 abbiamo qualche classe base in più che ci facilita il lavoro nel caso volessimo implementare un controllo custom da zero.

E' il caso della classe CompositeDataBoundControl, la quale ci fornisce l'infrastruttura di base per la creazione ci controlli compositi che funzionino tramite "databinding".

Un esempio potrebbe essere un controllo che visualizzi dei tag in dimensione diversa in proporzione al "peso"(TagCloud).

In questo caso il CompositeDataBoundControl si adatta bene in quanto il controllo sarà costituito da una collection di hyperlink che verrà costruita sulla base di un datasource.

Sulla costruzione di controlli compositi ci sono parecchie referenze in rete, in particolare rimando a questo articolo di Dino Esposito.

Il problema che ho dovuto affrontare spesso, e che ogni volta dimentico, è come fare in modo che il controllo cosi creato persista dopo un postback generico nella pagina.

La soluzione non è banale, anche se alla fine si tratta solo di mettere il codice nella posizione corretta!

La creazione degli elementi che compongono il controllo custom avviene nel metodo CreateChildControl(IEnumerable dataSource, bool dataBinding).

Questo metodo viene invocato durante il ciclo di vita della pagina sia quando c'e' un "databind" diretto, sia quando siamo in una situazione di postback da parte di altri controlli(e non c'e' quindi un databind specifico).

Durante il databind il controllo deve poter effettuare il "tracking" del viewstate dei controlli che lo compongono, in modo che sui successivi postback possa ricrearsi correttamente:

if (dataSource != null)
{
  CheckBoxList bookList = new CheckBoxList ();
  Controls.Add (bookList); --> deve stare qui, altrimenti non c'e' Tracking del Viewstate

  IEnumerator e = dataSource.GetEnumerator ();
  while (e.MoveNext ())
  {
    if (dataBinding)
    {
      ListItem item = new ListItem();
      ... --> solo quando sono in data bind, non entra qui se c'e' un postback generico
    }
  }

  Controls.Add (bookList); --> soluzione che viene spontanea, ma ERRATA.
}

 

Articoli di riferimento dalla quale ho preso spunto sono i seguenti:

http://aspnetresources.com/blog/composite_databound_control.aspx

http://scottonwriting.net/sowblog/posts/2129.aspx

Comments have been closed on this topic.
 

 

Copyright © Luca Mauri