Tips su DataBinding

di Cristian Civera, in .NET,

Per non fermare la mia ondata positiva di post ne approfitto di parlare di un argomento dove ogni tanto incappo anch'io. Inoltre se arrivo a 100 vinco una maglietta, a 200 una cena a casa di Daniele, a 500 la community passa in mano ai bresciani: io e Andrea :-D

Comunque, tornando al DataBinding, ritengo che il mio articolo sveli alcuni retroscena importanti. Leggetelo mi raccomando ;-)

Primo caso. Un errore che capita spesso è scrivere questo:

<asp:CheckBox runat="server" Checked='<%#DataBinder.Eval(Container.DataItem, "campo") %>' />

Non c'è nulla di sbagliato, ma bisogna prestare attenzione a due cose:

  • Racchiudere il tutto tra apice semplice se al suo interno usiamo le due virgolette. Ricordarsi infatti che il codice racchiuso tra <% %> è codice C# e dev'essere compilabile
  • Ciò che viene restituito da Eval o comunque da ciò che sta all'interno deve ritornare (in questo caso) un tipo booleano. Il codice in fase di binding prodotto dal parser sarà:

target = ((System.Web.UI.HtmlControls.HtmlInputCheckBox)(sender));
Container = ((System.Web.UI.Control)(target.BindingContainer));
target.Checked = ((bool)(DataBinder.Eval(Container.DataItem, "campo"));

Secondo caso. Concatenare valori in fase di binding:

<asp:Label Text='ciao<%=stringa%>' runat="server" />

Questo codice non funziona come ci si aspetta perché il parser non può impostare la proprietà perché "ciao" e <%= %> andrebbero impostate in fasi diverse. Il primo imposta la proprietà in fase di preinit, e il secondo scrive stringa in fase di render. Il codice autoprodotto infatti sarà:

__ctrl.Text = "ciao<%=stringa%>";

Oppure:

<asp:Label Text='<%# stringa %> stringa 2' runat="server" />

Non funziona, perché chiediamo di impostare la proprietà stringa in fase di binding e "stringa 2" in fase di preinit. Il parser non sapendo cosa fare prenderà tutto come stringa e producerà questo codice:

__ctrl.Text = "<%# stringa %> stringa 2";

Per ottenere quel risultato dobbiamo concatenare tra i tag:

<asp:Label Text='<%# stringa + " stringa 2" %>' runat="server" />

Di nuovo guardando il codice, verrà prodotto la funzione di binding con:

target.Text = System.Convert.ToString(stringa + " stringa 2");

Spero siano informazioni utili per voi.

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Nella stessa categoria
I più letti del mese