Author: Walkdan (walkdan(at)Gmail.com)
asp.net 2.0 的Eval()簡化了掉了ASP 1.1 Container.DataItem,比如:
<%# (Container.DataItem as DataRowView)[" 簡化為:(去掉了類型指定 ASP 1.1, Eval通過反射實現,本文不再闡述) 又簡化為(ASP 2.0): 2. 獲取DataItem Container
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
<%# Eval("ProductName") %>
Eval()是TemplateControl:Page 的方法
TemplateControl.Eval()可以自動計算出Container, 機制就是從一個dataBindingContext:Stack堆棧來獲取。
1. 建立DataItem Container 棧:
在Control.DataBind()中,建立,這樣可以保證子控件的DataItem Container始終在棧頂。
public class Control
{
protected virtual void DataBind(bool raiSEOnDataBinding)
{
bool foundDataItem = false;
if (this.IsBindingContainer)
{
object o = DataBinder.GetDataItem(this, out foundDataItem);
if (foundDataItem)
Page.PushDataItemContext(o); <-- 將DataItem壓入堆棧
}
try
{
if (raiseOnDataBinding)
OnDataBinding(EventArgs.Empty);
DataBindChildren(); <-- 綁定子控件
}
finally
{
if (foundDataItem)
Page.PopDataItemContext(); <-- 將DataItem彈出堆棧
}
}
}
public class Page
{
public object GetDataItem()
{
...
return this._dataBindingContext.Peek(); <-- 讀取堆棧頂部的DataItem Container,就是正在綁定的DataItem Container
}
}
3. TemplateContro.Eval()
public class TemplateControl
{
protected string Eval (string expression, string format)
{
return DataBinder.Eval (Page.GetDataItem(), expression, format);
}
}
新聞熱點
疑難解答