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



本文转自左正博客园博客,原文链接:http://www.cnblogs.com/soundcode/archive/2010/12/29/1920767.html,如需转载请自行联系原作者

目录
相关文章
|
2月前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
32 0
|
11月前
|
SQL 开发框架 .NET
ASP.NET 数据绑定详解 代码+步骤(下)
ASP.NET 数据绑定详解 代码+步骤
|
11月前
|
开发框架 .NET 数据库
ASP.NET 数据绑定详解 代码+步骤(上)
ASP.NET 数据绑定详解 代码+步骤
|
3月前
|
开发框架 前端开发 .NET
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
ASP.NET CORE 3.1 MVC“指定的网络名不再可用\企图在不存在的网络连接上进行操作”的问题解决过程
38 0
|
1月前
|
开发框架 前端开发 .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,然后在重定向到另
95 5
|
8月前
|
存储 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(五)
经过一段时间的准备,新的一期【ASP.NET Core MVC开发实战之商城系统】已经开始,在之前的文章中,讲解了商城系统的整体功能设计,页面布局设计,环境搭建,系统配置,及首页【商品类型,banner条,友情链接,降价促销,新品爆款】,商品列表页面,商品详情等功能的开发,今天继续讲解购物车功能开发,仅供学习分享使用,如有不足之处,还请指正。
114 0
|
9月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
[回馈]ASP.NET Core MVC开发实战之商城系统(三)
67 0
|
9月前
|
开发框架 前端开发 .NET
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
[回馈]ASP.NET Core MVC开发实战之商城系统(一)
113 0
|
9月前
|
SQL 开发框架 前端开发
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
[回馈]ASP.NET Core MVC开发实战之商城系统(开篇)
143 0