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

转载 2006年06月19日 19:09:00
Author: Walkdan 
 本文假设你已经了解ASP 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进。

 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又简化为,去掉了Container局部变量:
 <%# Eval("ProductName") %>
 
 那么,Page.Eval()又是如何知道"ProductName"是那个数据的属性呢,即Container.DataItem真的消失了吗?

 Eval()是Page的父类TemplateControl的方法
 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. TemplateControl.Eval()
    public class TemplateControl
    {
        protected string Eval (string expression, string format)
        {
            return DataBinder.Eval (Page.GetDataItem(), expression, format);   
        }
    }        

结论:从上面看出Page.Eval()在计算的时候还是引用了Container.DataItem,只不过这个DataItem通过DataItem Container堆栈自动计算出来的。我认为Page.Eval()看似把问题简化了,其实把问题搞得更加神秘。

相关文章推荐

ASP.NET 2.0 数据绑定高级技巧

  • 2008年09月29日 12:14
  • 12.91MB
  • 下载

ASP.NET 2.0 中实现模板中的数据绑定系列

模板化的数据绑定控件为我们在页面上显示数据提供了根本的灵活性。你可能还记得ASP.net v1.x中的几个模板化控件(例如DataList和Repeater控件)。ASP.NET 2.0仍然支持这些控...
  • wyh0318
  • wyh0318
  • 2012年04月10日 13:52
  • 145

asp.net2.0数据绑定高级技巧

  • 2007年12月10日 13:57
  • 343KB
  • 下载

ASP.NET+2.0+数据绑定高级技巧 pdf

  • 2008年12月28日 23:15
  • 405KB
  • 下载

数据绑定表达式 Eval() 和Bind()的区别

绑定表达式 区别  1,eval是只读数据,Bind是可更新的. 2.当再次表达式操作时候,必须用Eval 如 3.若GridView中绑定列里面 设置 内容格式 DataFormat...

c#中的数据绑定 Eval和Bind的区别

Eval 单向绑定:数据是只读的 Bind 双向绑定:数据可以更改,并返回服务器端,服务器可以处理更改后的数据,如存入数据库. ----------------------------------...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP 2.0 数据绑定函数Eval()的机制
举报原因:
原因补充:

(最多只允许输入30个字)