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相比,会导致性能明显下降。
1130 0
|
.NET 开发框架
ASP中的EVAL函数
  近两日,学习了ASP的EVAL函数。感觉上很实用,如果使用得当,能减轻很多代码的编写量,也使得代码更加简洁明了。   EVAL函数的原型:   EVAL(expression)   其中expression是字符串参数,可以是表达式,可以是变量,甚至可以是语句。
746 0
|
15天前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
26 0
|
16天前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
20天前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
72 0
|
4月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
137 0
|
4月前
|
开发框架 前端开发 JavaScript
JavaScript云LIS系统源码ASP.NET CORE 3.1 MVC + SQLserver + Redis医院实验室信息系统源码 医院云LIS系统源码
实验室信息系统(Laboratory Information System,缩写LIS)是一类用来处理实验室过程信息的软件,云LIS系统围绕临床,云LIS系统将与云HIS系统建立起高度的业务整合,以体现“以病人为中心”的设计理念,优化就诊流程,方便患者就医。
62 0
|
4月前
|
开发框架 前端开发 .NET
C# .NET面试系列六:ASP.NET MVC
<h2>ASP.NET MVC #### 1. MVC 中的 TempData\ViewBag\ViewData 区别? 在ASP.NET MVC中,TempData、ViewBag 和 ViewData 都是用于在控制器和视图之间传递数据的机制,但它们有一些区别。 <b>TempData:</b> 1、生命周期 ```c# TempData 的生命周期是短暂的,数据只在当前请求和下一次请求之间有效。一旦数据被读取,它就会被标记为已读,下一次请求时就会被清除。 ``` 2、用途 ```c# 主要用于在两个动作之间传递数据,例如在一个动作中设置 TempData,然后在重定向到另
234 5
|
4月前
|
开发框架 前端开发 .NET
进入ASP .net mvc的世界
进入ASP .net mvc的世界