Effettuare il binding di campi nulli ad un controllo ASP.NET

di Bruno A. Zambetti, in ASP.NET, ADO.NET, DataBinding,

Un problema che si pone effettuando il binding ad un controllo (per esempio un datagrid o una combo) di una fonte dati creata a partire dai dati contenuti in un database, è quello di incontrare dei campi posti a NULL.
Può infatti capitare che per alcuni dei campi utilizzati (pensiamo a quelli generici di "note") il database consenta di impostare a NULL il valore (che, lo ricordo, è ben diverso dall'inserire un valore vuoto, ma ha il significato di "non specificato"), e che quindi, al momento di creare l'output, si verifichi un errore.

.NET non riesce infatti ad effettuare il binding di un campo il cui valore è NULL (un campo di questo tipo può venire facilmente identificato tramite la funzione isDbNull di VB.NET) e genera un errore di runtime che impedisce di visualizzare la pagina.
Un trucco molto semplice per evitare questo problema, senza ovviamente intervenire nella base dati o negli strati applicativi superiori che la utilizzano sui quali sarebbe scorretto mettere le mani per un problema di mera visualizzazione, è quello di forzare il casting del campo a string.
Tale soluzione funziona sia per le WebForms e quindi per le pagine ASPX che contengono il codice di gestione in una apposita libreria compilata (modello WebClass di VB6) richiamata tramite la direttiva "codebehind", sia per le pagine ASPX pure e semplici (modello ASP tradizionale).

Ipotizziamo di aver inserito in un controllo Repeater il codice per visualizzare il campo note della nostra fonte dati.
Il modo più semplice, che deriva direttamente da una semplice tecnica di programmazione normalmente utilizzata in contesto WebClass di VB6 (dove il processo di generazione degli elenchi con separazione fra HTML e codice elaborato è molto simile), è quello di concatenare all'espressione una stringa vuota. Questo forza il runtime ad effettuare un casting a stringa dell'espressione, e, si sa, il casting a stringa di una campo NULL è rappresentato dalla stringa vuota (in verità potrebbe essere qualsiasi cosa, ma si intuisce facilmente che questa è la soluzione più ragionevole ed è quindi quella che .NET implementa).

Basta dunque utilizzare questa sintassi:

<%# (DataBinder.Eval(Container.DataItem, "note") & "") %>

Questa operazione non influenza l'output dei campi che contengono un valore, ma evita appunto il problema dei campi NULL. Il tutto ad un costo basso per l'elaborazione e minimo per la scrittura e leggibilità del codice.

In questo modo il problema è risolto. Se volessimo invece seguire altre strade, come quella di visualizzare un "-" per i campi a NULL, dovremmo seguire un approccio completamente diverso, scrivendo una procedura con un prototipo del tipo:

Private Sub myRepeater_ItemCreated(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.RepeaterItemEventArgs) Handles myRepeater.ItemCreated

e lavorando in maniera ciclica su ogni riga che viene creata.
Un'operazione decisamente più lunga per il runtime e complessa per noi, per cui è preferibile evitarla a meno che non sia effettivamente necessario svolgere delle elaborazioni di logica durante la creazione di ogni riga (per esempio mostrando o nascondendo un certo campo a seconda del valore di altri).