ASP源码
PHP源码
.NET源码
JSP源码
Author: Walkdan (walkdan(at)gm***.com)
ASP.NET 2.0 的Eval()简化了掉了ASP 1.1 Co***iner.DataItem,比如:
<%# (Co***iner.DataItem as DataRowView)["ProductName"].ToString() %>
简化为:(去掉了类型指定 ASP 1.1, Eval通过反射实现,本文不再阐述)
<%# Da***inder.Eval(Co***iner.DataItem, "ProductName").ToString() %>
又简化为(ASP 2.0):
<%# Eval("ProductName") %>
Eval()是TemplateControl:Page 的方法
Te***ateControl.Eval()可以自动计算出Container, 机制就是从一个dataBindingContext:Stack堆栈来获取。
1. 建立DataItem Container 栈:
在Co***ol.DataBind()中,建立,这样可以保证子控件的DataItem Container始终在栈顶。
public class Control
{
protected virtual void DataBind(bool raiseOnDataBinding)
{
bool foundDataItem = false;
if (th***IsBindingContainer)
{
object o = Da***inder.GetDataItem(this, out foundDataItem);
if (foundDataItem)
Pa***PushDataItemContext(o); <-- 将DataItem压入堆栈
}
try
{
if (raiseOnDataBinding)
OnDataBinding(Ev***Args.Empty);
DataBindChildren(); <-- 绑定子控件
}
finally
{
if (foundDataItem)
Pa***PopDataItemContext(); <-- 将DataItem弹出堆栈
}
}
}
2. 获取DataItem Container
public class Page
{
public object GetDataItem()
{
...
return th***_dataBindingContext.Peek(); <-- 读取堆栈顶部的DataItem Container,就是正在绑定的DataItem Container
}
}
3. Te***ateContro.Eval()
public class TemplateControl
{
protected string Eval (string expression, string format)
{
return Da***inder.Eval (Pa***GetDataItem(), expression, format);
}
}