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

简介: 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在数据绑定方面的应用是众所周知的,不过技术在发展,当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,比如数据绑定表达式:

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

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

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

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

  1. <%# Eval("ProductName") %>

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

ASP.NET Eval()是Page的父类TemplateControl的方法

TemplateControl.Eval()可以自动计算出Container, 机制就是从一个dataBindingContext:Stack堆栈来获取。

1. 建立DataItem Container 栈:

在Control.DataBind()中,建立,这样可以保证子控件的DataItem Container始终在栈顶。

  1. publicclass Control
  2. {
  3.  protectedvirtualvoid DataBind(bool raiseOnDataBinding)
  4.  {
  5. bool foundDataItem = false;
  6. if (this.IsBindingContainer)
  7. {
  8.  object o = DataBinder.GetDataItem(this, out foundDataItem);
  9.  if (foundDataItem)
  10. Page.PushDataItemContext(o); <-- 将DataItem压入堆栈
  11. }
  12. try
  13. {
  14.  if (raiseOnDataBinding)
  15. OnDataBinding(EventArgs.Empty);
  16.  DataBindChildren(); <-- 绑定子控件
  17. }
  18. finally
  19. {
  20.  if (foundDataItem)
  21. Page.PopDataItemContext(); <-- 将DataItem弹出堆栈
  22. }
  23.  }
  24. }

2. 获取DataItem Container

  1. publicclass Page
  2. {
  3.  publicobject GetDataItem()
  4.  {
  5. ...
  6. returnthis._dataBindingContext.Peek(); <-- 读取堆栈顶部的DataItem Container,就是正在绑定的DataItem  Container
  7.  }
  8. }

3. TemplateControl.Eval()

  1. publicclass TemplateControl
  2. {
  3.  protectedstring Eval (string expression, string format)
  4.  {
  5. return DataBinder.Eval (Page.GetDataItem(), expression, format);
  6.  }
  7. }

结论:

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

本文来源:http://developer.51cto.com/art/200909/151121.htm

目录
相关文章
|
.NET 数据库 容器
ASP.NET Eval四种绑定方式
ASP.NET Eval四种绑定方式: 1、1.x中的数据绑定语法 2、 2.x简化Eval数据绑定语法 3、第二种方法的方法重载 4、eval同时绑定两个值 eval_r()方法在运行时使用反射执行后期绑定计算,因此与标准的ASP.NET数据绑定方法bind相比,会导致性能明显下降。
1182 0
|
.NET 开发框架
ASP中的EVAL函数
  近两日,学习了ASP的EVAL函数。感觉上很实用,如果使用得当,能减轻很多代码的编写量,也使得代码更加简洁明了。   EVAL函数的原型:   EVAL(expression)   其中expression是字符串参数,可以是表达式,可以是变量,甚至可以是语句。
787 0
|
10月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
170 7
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
331 0
|
10月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
183 0
|
11月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
133 0
|
11月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
212 0
|
11月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
339 0
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
227 0