Ieri mattina mi è stato chiesto se fosse possibile, in un sito Dynamic Data, cambiare il contenuto di un Field Template in seguito alla modifica di un altro campo mostrato nella stessa pagina (ad esempio, cancellare il contenuto di una TextBox quando si seleziona un nuovo valore in una DropDownList). Questa cosa, teoricamente molto semplice, in realtà non è così banale, per via del modello ad oggetti utilizzato dal Framework dei Dynamic Data, in cui ogni Field Template è un controllo ASCX a parte, quindi isolato dagli altri, e tutti gli oggetti per visualizzare e modificare i dati sono creati dinamicamente.
Dopo qualche esperimento, ho provato a chiedere una mano sul forum dei Dynamic Data ospitato nel sito http://www.asp.net. Ho così ricevuto una risposta dal mitico Stephen Naughton, autore del blog C# Bits, una vera miniera di informazioni sui Dynamic Data. In particolare, mi ha indirizzato sul suo post Cascading or Dependant Field Templates for ASP.Net 4.0 Preview (a discapito del nome, il metodo funziona anche con .NET 3.5 SP1), che era esattamente quello che mi serviva.
La soluzione proposta è molto elegante e versatile, ma proprio per tale motivo è abbastanza complessa. Basandomi su questo codice, e adattandolo alle mie esigenze particolari, ho realizzato un semplice Extension Method che aggiunge al tipo FieldTemplateUserControl una funzione per trovare il controllo della stessa pagina associato alla colonna specificata. Ad esempio, supponiamo di aver aggiunto la proprietà Text nel template Text_Edit.ascx e di voler modificare questo campo quando si seleziona un nuovo valore nella DropDownList di un altro template:
protected void DropDownList1_SelectedIndexChanged(object sender, EventArgs e)
{
this.GetControl<Text_EditField>("Name").Text = DropDownList1.SelectedValue;
}
L'evento DropDownList1_SelectedIndexChanged è contenuto all'interno di un Field Template. Il metodo generico GetControl cerca nella pagina il template associato alla colonna Name, quindi ne imposta la proprietà Text.
Per dimostrare il funzionamento del sistema, ho realizzato un'applicazione di prova che può essere scaricata dalla sezione Files di DotNetToscana.