日期:2009-10-25 浏览次数:21166 次
<%# (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