Nei Dynamic Data quando abbiamo una relazione uno a molti possiamo utilizzare l’attributo DisplayColumn per determinare quale tra le proprietà della classe sulla parte uno della relazione viene utilizzata nel testo del link.

[MetadataType(typeof(CustomerMetadata))]
[DisplayColumn("CompanyName", "CompanyName", false)]
public partial class Customer
{
   ...
}

Analizzando nel dettaglio il controllo ForeignKey.ascx che visualizza il campo chiave esterna notiamo che il testo del link viene popolato utilizzando il metodo GetDisplayString della classe MetaTable. Utilizzando Reflector vediamo come si comporta questo metodo:

public string GetDisplayString(object row)
{
  if (row != null)
  {
    row = this.PreprocessRowObject(row);
    if (this.HasToStringOverride)
    {
      return row.ToString();
    }
    object propertyValue = 
      DataBinder.GetPropertyValue(row, this.DisplayColumn.Name);
    if (propertyValue != null)
    {
      return propertyValue.ToString();
    }
  }
  return string.Empty;
}

Dall’analisi del codice notiamo come l’attributo DisplayColumn non abbia effetto se abbiamo eseguito l’override del metodo ToString() nella classe della chiave esterna.

In questo modo se nella classe Customer dell’esempio andiamo ad eseguire l’override del metodo ToString() nel seguente modo…

public override string ToString()
{
  return String.Format("{0} - ({1})", this.CompanyName, this.Country);
}

… l’effetto che otteniamo è il seguente:

DisplayColumn

Ovviamente possiamo ovviare a questo comportamento modificando opportunamente il controllo ForeignKey affinché utilizzi direttamente l’attributo DisplayColumn.