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,如需转载请自行联系原作者

目录
相关文章
|
9月前
|
SQL 开发框架 前端开发
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
ASP.NET WEB项目中GridView与Repeater数据绑定控件的用法
97 0
|
SQL 开发框架 .NET
ASP.NET 数据绑定详解 代码+步骤(下)
ASP.NET 数据绑定详解 代码+步骤
|
开发框架 .NET 数据库
ASP.NET 数据绑定详解 代码+步骤(上)
ASP.NET 数据绑定详解 代码+步骤
|
.NET 开发框架 索引
asp.net学习之 数据绑定控件--List数据绑定控件
原文:asp.net学习之 数据绑定控件--List数据绑定控件     List控件(如 CheckBoxList、DropDownList、ListBox 和 RadioButtonList 类)继承自ListControl类,不能直接创建 ListControl 抽象类的实例。
1175 0
|
5月前
|
开发框架 前端开发 JavaScript
ASP.NET MVC 教程
ASP.NET 是一个使用 HTML、CSS、JavaScript 和服务器脚本创建网页和网站的开发框架。
61 7
|
5月前
|
存储 开发框架 前端开发
ASP.NET MVC 迅速集成 SignalR
ASP.NET MVC 迅速集成 SignalR
110 0
|
6月前
|
开发框架 前端开发 .NET
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
ASP.NET MVC WebApi 接口返回 JOSN 日期格式化 date format
80 0
|
6月前
|
开发框架 前端开发 安全
ASP.NET MVC 如何使用 Form Authentication?
ASP.NET MVC 如何使用 Form Authentication?
|
6月前
|
开发框架 .NET
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
Asp.Net Core 使用X.PagedList.Mvc.Core分页 & 搜索
184 0