Eval("FieldName") 是 TemplateControl.Eval 的簡化呼叫,透過 Page.GetDataItem() 從 _dataBindingContext 堆疊取得目前繫結的 DataItem,再委派 DataBinder.Eval 以反射取值。
Control.DataBind() 執行時,若為 IBindingContainer (如 GridViewRow、RepeaterItem),呼叫 Page.PushDataItemContext(dataItem) 將 DataItem 推入堆疊DataBindChildren() 繫結子控制項,此時堆疊頂端即為當前項目Eval() 呼叫 Page.GetDataItem() → _dataBindingContext.Peek() 取得 DataItemfinally 區塊 Page.PopDataItemContext() 彈出堆疊// Control.DataBind 簡化
protected virtual void DataBind(bool raise)
{
if (this.IsBindingContainer)
{
object dataItem = DataBinder.GetDataItem(this, out found);
if (found) Page.PushDataItemContext(dataItem);
}
try { DataBindChildren(); }
finally { if (found) Page.PopDataItemContext(); }
}
// TemplateControl.Eval
protected string Eval(string expr, string fmt)
{
return DataBinder.Eval(Page.GetDataItem(), expr, fmt);
}
Eval() 並未消除 Container.DataItem,而是將其隱藏於堆疊機制中。優點:語法簡潔;缺點:除錯時難以直觀檢視繫結上下文,效能略低於直接強型別存取 (如 ((MyRow)Container.DataItem).Field)。