Autor: Walkdan (walkdan(at)gmail.com)
Eval() von ASP.NET 2.0 vereinfacht ASP 1.1 Container.DataItem, wie zum Beispiel:
<%# (Container.DataItem as DataRowView)["ProductName"].ToString( ) %>
wird vereinfacht zu: (ASP 1.1 entfernt die Typspezifikation, Eval wird durch Reflektion implementiert, was in diesem Artikel nicht erläutert wird)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
wird vereinfacht zu (ASP 2.0):
<%# Eval("ProductName") %>
Eval() ist eine Methode von TemplateControl:Page
TemplateControl.Eval() kann den Container automatisch berechnen und der Mechanismus besteht darin, ihn aus einem dataBindingContext:Stack-Stapel abzurufen.
1. Erstellen Sie den DataItem-Container-Stack:
Richten Sie dies in Control.DataBind() ein, um sicherzustellen, dass sich der DataItem-Container des untergeordneten Steuerelements immer oben im Stapel befindet.
öffentliche Klassensteuerung
{
protected virtual void DataBind(bool raiseOnDataBinding)
{
bool FoundDataItem = false;
if (this.IsBindingContainer)
{
object o = DataBinder.GetDataItem(this, outfoundDataItem);
if(foundDataItem)
Page.PushDataItemContext(o); <-- DataItem auf den Stapel verschieben
}
versuchen
{
if (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <-- untergeordnete Steuerelemente binden
}
Endlich
{
if(foundDataItem)
Page.PopDataItemContext(); <-- Entfernen Sie das DataItem vom Stapel
}
}
}
2. DataItem-Container abrufen
öffentliche Klassenseite
{
öffentliches Objekt GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- Liest den DataItem-Container oben im Stapel, bei dem es sich um den DataItem-Container handelt, der gebunden wird.
}
}
3. TemplateContro.Eval()
öffentliche Klasse TemplateControl
{
geschützte String-Auswertung (String-Ausdruck, String-Format)
{
return DataBinder.Eval (Page.GetDataItem(), expression, format);
}
}