WEB开发网
开发学院WEB开发ASP.NET ASP 2.0 数据绑定函数Eval()的机制 阅读

ASP 2.0 数据绑定函数Eval()的机制

 2006-06-17 17:09:22 来源:WEB开发网   
核心提示:Author: Walkdan (walkdan(at)Gmail.com) asp.net 2.0 的Eval()简化了掉了ASP 1.1 Container.DataItem,比如: <%# (Container.DataItem as DataRowView)["PRoductName"

Author: Walkdan (walkdan(at)Gmail.com)

 asp.net 2.0 的Eval()简化了掉了ASP 1.1 Container.DataItem,比如:

 <%# (Container.DataItem as DataRowView)["PRoductName"].ToString() %>   

 简化为:(去掉了类型指定 ASP 1.1, Eval通过反射实现,本文不再阐述)
 <%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>   

 又简化为(ASP 2.0):
 <%# 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()
     {
       ...
       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);  
     }
   }

Tags:ASP 数据 绑定

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接