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 Eval四种绑定方式

ASP.NET Eval四种绑定方式: 1、1.x中的数据绑定语法 ' /> 2、 2.x简化Eval数据绑定语法 ' /> 3、第二种方法的方法重载 '> ...
  • GUO_LOVER
  • GUO_LOVER
  • 2016年07月07日 13:38
  • 1365

数据绑定Eval与Bind区别

使用数据绑定语法,可以将控件属性值绑定到数据,并指定值以对数据进行检索、更新、删除和插入操作。 数据绑定语法          数据绑定表达式包含在  分隔符之内,并使用 Eval 和 Bind ...
  • nuptsv_ice
  • nuptsv_ice
  • 2014年04月21日 16:55
  • 909

asp.net中的各种数据绑定使用

翻出以前的asp.net学习笔记,发现很多有关Gridview中的数据绑定使用,发上来大家看看,新手参考(控件党神器,嘿嘿。。。),高手莫笑! 1、Gridview设置时间格式 2、绑定后台函...
  • wangqiuyun
  • wangqiuyun
  • 2013年06月30日 00:03
  • 9863

Ajax中的eval函数的用法

eval的定义和使用 Eval它是用来计算某个字符串,并且执行其中的JavaScript代码。 语法: 1) eval函数接受一个string这个参数,并且这个参数是必须的,这个参数...
  • moxiaoya1314
  • moxiaoya1314
  • 2016年12月30日 09:21
  • 367

asp.net数据绑定表达式

一、简单数据绑定   数据绑定表达式是由(分隔符)包裹的可执行代码,以#号作为前缀。一般使用数据绑定表达式在服务器控件的起始标签内设置属性值。数据绑定表达式可以通过DataBoundLiteralC...
  • weitao1234
  • weitao1234
  • 2014年08月30日 01:31
  • 638

【Asp.net之旅】--数据绑定控件之DataList

       上篇博客讨论了Repeater控件的基本用法,它是最基本的数据绑定控件,只提供了数据绑定的功能,熟练运用Repeater控件后,其它类似的数据绑定控件就很简单了。接着我们上篇博客的内...
  • zhang_xinxiu
  • zhang_xinxiu
  • 2014年03月28日 09:28
  • 24399

《ASP.NET》数据绑定——GridView

GirdView简介:      名称:网络视图。     来源:GridView 是 DataGrid的后继控件,在.net framework 2 中,虽然还存在DataGrid,但是GridVi...
  • u013067402
  • u013067402
  • 2015年07月24日 21:36
  • 2035

ASP.Net数据绑定控件小结

数据绑定作为ASP.Net中较为重要的一个知识点,其中涉及到了三个重要的数据绑定控件,Repeater DataList 和GridView(DataGrid)。 Repeater控件:   特点: ...
  • zllaptx4869
  • zllaptx4869
  • 2013年10月09日 21:59
  • 1705

python神奇函数之eval()学习

python中有很多内置的很有用的工具函数,熟练地使用这些小工具绝对可以帮助你在工作中达到事半功倍的效果,今天由于需要用到了eval()函数,这个函数其实之前就用过了但是由于最近一直忙于看论文和方向上...
  • Together_CZ
  • Together_CZ
  • 2017年05月23日 15:44
  • 2055

AngularJs数据绑定原理

注 这篇博文主要是写给新手的,是给那些刚刚开始接触Angular,并且想了解数据帮定是如何工作的人。如果你已经对Angular比较了解了,那强烈建议你直接去阅读源代码。 Angular用户都想知道...
  • Rongbo_J
  • Rongbo_J
  • 2016年03月20日 10:38
  • 3013
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP 2.0 数据绑定函数Eval()的机制
举报原因:
原因补充:

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