日期:2009-10-25 浏览次数:20979 次
<%# (Container.DataItem as DataRowView)["ProductName"].ToString() %>
ASP 1.1简化为:(去掉了类型指定, Eval通过反射实现,本文不再阐述)
<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
ASP 2.0又简化为,去掉了Container局部变量:
<%# 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弹出堆栈
}
}
}
2. 获取DataItem Container
public class Page
{
public object GetDataItem()
{
...
retu