ASP.NET Eval在数据绑定方面的应用是众所周知的,不过技术在发展,当ASP.NET Eval 1.1变成ASP.NET Eval 2.0的时候,在操作的时候会有什么变化呢?

  假设你已经了解ASP.NET Eval 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP.NET Eval 2.0数据绑定做了那些改进。

  ASP.NET Eval 2.0 的数据绑定函数Eval()简化掉了ASP.NET Eval 1.1神秘的Container.DataItem,比如数据绑定表达式:

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

  ASP.NET Eval 1.1简化为:(去掉了类型指定, Eval通过反射实现,本文不再阐述)

<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>

  ASP.NET Eval 2.0又简化为,去掉了Container局部变量:

<%# Eval("ProductName") %>

  那么,Page.Eval()又是如何知道"ProductName"是那个数据的属性呢,即Container.DataItem真的消失了吗?

  ASP.NET 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()看似把问题简化了,其实把问题搞得更加神秘。

转载于:https://www.cnblogs.com/waw/archive/2011/09/02/2162980.html

一起谈.NET技术,ASP.NET Eval如何进行数据绑定相关推荐

  1. ASP.NET Eval如何进行数据绑定

    ASP.NET Eval在数据绑定方面的应用是众所周知的,不过技术在发展,当ASP.NET Eval 1.1变成ASP.NET Eval 2.0的时候,在操作的时候会有什么变化呢? 假设你已经了解AS ...

  2. 一起谈.NET技术,asp.net控件开发基础(20)

    上面我们讨论了数据绑定控件的做法,但都未涉及到asp.net2.0中数据源控件的用法,让用惯了数据源控件的人可能感觉不适应.这次我们就开始讨论在asp.net2.0中,我们该如何重新定义数据绑定控件. ...

  3. Asp.net Eval 学习总结

    C# Eval在asp.net中的用法及作用 https://www.cnblogs.com/Mr_JinRui/archive/2010/07/06/1772129.html Eval( " ...

  4. 浅谈虚拟化技术下的云安全如何处置

    浅谈虚拟化技术下的云安全如何处置 近年来,云计算是目前非常热门的一个研究领域,其实它并不是一种全新的技术,而是许多技术的融合体,包括分布式计算.动态和拓展等各种各样的技术算法,而虚拟化技术是云计算里最 ...

  5. 技术创业需胆识 谈IT技术人员的创业 (http://www.cnblogs.com/dudu/archive/2007/05/27/761740.html)...

    技术创业需胆识 谈IT技术人员的创业 作者:李立辉 我自己介绍一下:本人96年西点毕业,学的是无线通信,柳传志是我的校友,后来分配到北京巨龙做交换机,98年去了深圳中兴,当时看到中兴日益强大,和华为的 ...

  6. 浅谈.NET技术公司的实习生培养

    浅谈.NET技术公司的实习生培养 背景 近几年.NET开发者市场的越发不景气,一毕业就选择.NET技术的开发者更是少之又少.一方面是公司效益的日益提高,一方面却是招聘优秀人才的速度总是赶不上公司发展的 ...

  7. 以计算机谈人文科学,阅读下面一段文字,完成问题   自20世纪80年代以来,世界都在谈“软科学技术”,何谓软科学?经常听人说:“脑子不够使。”这其实就是对软科学的需求。于是,从古至今,...

    阅读下面一段文字,完成问题 自20世纪80年代以来,世界都在谈"软科学技术",何谓软科学?经常听人说:"脑子不够使."这其实就是对软科学的需求.于是,从古至今, ...

  8. 浅谈Hybrid技术的设计与实现【转】

    https://www.cnblogs.com/yexiaochai/p/4921635.html 前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术 ...

  9. 浅谈Hybrid技术的设计与实现第二弹

    前言 浅谈Hybrid技术的设计与实现 浅谈Hybrid技术的设计与实现第二弹 浅谈Hybrid技术的设计与实现第三弹--落地篇 接上文:浅谈Hybrid技术的设计与实现(阅读本文前,建议阅读这个先) ...

最新文章

  1. vue 循环 递归组件_全局组件实现递归树,避免循环引用
  2. 简单的字幕效果html,7种HTML5 Figure图片字幕标题特效
  3. 删除文件夹下所有的文件_VB删除文件和文件夹的方法
  4. Oracle 制造死锁和查询死锁
  5. k8s | 搞不明白为什么大家都在学习 k8s
  6. 委派控制-将计算机加入域
  7. thinkphp中的__DIR__ __ROOT__ __APP__ __MODULE__ APP_PATH LIB_PATH MODULE_PATH 等是在哪里定义的?...
  8. msysgit+apache安装说明 - gitweb服务器部分
  9. 由数据范围反推算法复杂度
  10. Atitit.软件gui按钮and面板---通讯子系统(区)-- github 的使用....
  11. 制作自启动的MSDN简体中文版和英文版win98ISO镜像
  12. 我是如何自学C语言的(一个菜鸟的学习路)
  13. 滑动窗口协议如何实现流量控制
  14. 机器人仿真论文阅读2
  15. 腾讯元老、上市公司CTO辞职后,每天对着200亩地发呆
  16. vnc远程控制软件官网,值得一用的5款vnc远程控制软件官网
  17. windows10任务栏一直转圈-无法操作假死状态
  18. Musical Christmas Lights——一个圣诞树灯光✨随音乐节奏改变的前端开源项目
  19. 【面经】兴业证券大数据工程师面经
  20. 哼唱识别(query by humming)

热门文章

  1. Java并发- 读写锁中的性能之王:StampedLock
  2. 【Python】轻量级分布式任务调度系统-RQ
  3. 什么是 Delta 文件
  4. 改用C++生成自动化数据表
  5. Windows域信任关系建立全攻略
  6. 单点登陆的技术实现机制
  7. vsftpd学习笔记
  8. 在MasterPage下FindControl的使用方法
  9. 判断SIM卡属于哪个移动运营商
  10. 2019以太坊开发者及应用峰会(北京)