Prima di tutto: Eval è piuttosto male. Come cita la risposta di @ NiranjanKala, utilizza Reflection per ottenere il valore della proprietà / campo rilevanti e l'utilizzo di Reflection per ottenere i valori dai membri degli oggetti è molto lento (vedi questo articolo per maggiori dettagli).
Come per le altre due sintassi, dipende davvero. Ero un sostenitore della sintassi del binding di eventi, in quanto riduce il disordine nel file ASPX e mantiene separata la logica di associazione e il markup. Inoltre, è facile eseguire il debug e puoi utilizzare altre funzionalità come i sub-repeater che condividono modelli con il ripetitore genitore per i dati gerarchici o la possibilità di attivare e disattivare altri controlli all'interno del ripetitore in base ai dati accessibili. Penso che si adatti davvero all'approccio "stateful web" usato da WebForms.
Tuttavia, più recentemente ho fatto un sacco di MVC e puoi davvero applicare un approccio simile ai ripetitori; associare un oggetto preformattato e non è più necessario preoccuparsi che i metodi "shim" siano nell'ASPX:
protected class MyUiBoundClass
{
public string DataField {get;set;}
}
public IEnumerable<MyUiBoundClass> PrepareForBind(IEnumerable<MyEntity> entities)
{
return entities.Select(x =>
new MyUiBoundClass {
DataField = FormatMyData(entity.DataField)
});
}
public void LoadAndBindData()
{
/// Load some data from somewhere.
IEnumerable<MyEntity> myData = this.SomeService.LoadMyData();
IEnumerable<MyUiBoundClass> myFormattedData = PrepareToBind(myData);
this.MyRepeater.DataSource = myFormattedData;
this.MyRepeater.DataBind();
}
Se si utilizza questo modello in stile ViewModel, si separa la formattazione dei dati dal markup e si utilizza ancora il più veloce e più conciso <% #% > sintassi. Inoltre, hai praticamente risolto il problema "più difficile da eseguire il debug" che normalmente viene fornito con <% #% > sintassi, come si troverà tutto il codice debug-degno nel metodo PrepareToBind.