Nei Dynamic Data possiamo, attraverso l’attributo UIHint, impostare il FieldTemplate da utilizzare per un determinato campo dati, e non solo, tramite la proprietà ControlParameters possiamo passare delle informazioni ai controlli, per esempio per impostarne delle proprietà. Vediamo come:

public IDictionary ControlParameters { get; private set; }

La proprietà ControlParameters è un insieme di coppie chiave/valore che possiamo popolare direttamente nella decorazione del campo nella classe dei metadati intervallando chiavi e valori separati da una virgola:

// ControlParameters populating: key1, value1, key2, value2 ...
[UIHint("Text", null, "Columns", 75 )
public string ContactName { ge; set; }

Nell’esempio sopra utilizziamo per il campo ContactName il template Text al quale passiamo una coppia chiave/valore con la quale vogliamo impostare la lunghezza della TextBox a 75 colonne.

Nel FieldTemplate andiamo ad intercettare l’evento PreRender e ciclando sulla collezione dei parametri utilizziamo la chiave per ottenere la proprietà corrispondente per il controllo TextBox esposto dalla proprietà DataControl. A questo punto assegnamo alla proprietà il valore utilizzando l’opportuno convertitore ottenuto dal tipo attraverso la classe TypeDescriptor.

public partial class Text_EditField 
     : System.Web.DynamicData.FieldTemplateUserControl
{
  ...
  protected void OnPreRender(EventArgs e)
  {
    UIHintAttribute hint = null;
    hint=(UIHintAttribute)this.Column.Attributes[typeof(UIHintAttribute)];
    if (hint != null)
    {
      foreach (KeyValuePair kvp in hint.ControlParameters)
      {
        PropertyInfo prop = DataControl.GetType().GetProperty(kvp.Key);
        String value = kvp.Value.ToString();
        var converter = TypeDescriptor.GetConverter(prop.PropertyType);
        if (prop != null)
        {
          prop.SetValue(DataControl, 
             converter.ConvertFromInvariantString(value), null);
        }
      }
    }
  }
  protected override void ExtractValues(IOrderedDictionary dictionary)
  {
    dictionary[Column.Name] = ConvertEditedValue(TextBox1.Text);
  }
  public override Control DataControl
  {
    get
    {
      return TextBox1;
    }
  }
}

In questo esempio ho utilizzato il FieldTemplate Text_Edit.ascx, ma se vogliamo estendere tale funzionalità a tutti i controlli possiamo pensare di creare una nostra classe che erediti direttamente da FieldTemplateUserControl ed inserire questo codice nell’override del metodo OnPreRender. Ovviamente questo implica (per questa soluzione) che le proprietà impostate nella ControlParameters vengano propagate per tutti i controlli utilizzati per renderizzare i dati del campo così decorato (ad esempio Text.ascx, Text_Edit.ascx e se esiste Text_Insert.ascx).