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,比如数据绑定表达式:

  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

时间: 2024-10-12 18:14:23

ASP.NET Eval如何进行数据绑定的相关文章

ASP.NET Eval进行数据绑定的方法_实用技巧

假设你已经了解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"].ToStrin

请问大家ASP.NET的aspx页面数据绑定&amp;amp;lt;%# Eval(&amp;amp;quot; 这里面是数据库的字段还是实体层的字段属性&amp;amp;quot;)%&amp;amp;gt; 谢谢

问题描述 请问大家ASP.NET的aspx页面数据绑定<%#Eval("这里面是数据库的字段还是实体层的字段属性")%>谢谢 解决方案 解决方案二:数据库的!其实也就是DATASET采集数据库的原始数据字段的列!解决方案三:数据源是DataTable就是字段,DataSource是实体列表就是实体属性解决方案四:看你的数据源.你要绑定的是DataTable就是DataTable的列名,要是SqlDataReader就是查询字段名,要是绑定的类(例如model)就是属性名称解

asp.net Eval和Bind区别分析

eval和bind的区别 最近在做asp教程.net的项目,因为涉及到数据库教程项目的绑定,而eval和bind一直老是忘记,现在baidu了下,留个记号: 绑定表达式 <%# eval("字段名") %> <%# bind("字段名")%> 最主要的区别: 1.eval取出来的数据时只读的,而bind是可更新的数据. 2.eval通常用来需要对数据进行格式化成字符串,因而和bind方法比,性能会有所下降. 3.在运行时,eval调用data

ASP.NET 2.0 和数据绑定控件:新的角度,新的做法

asp.net|控件|数据 适用于:Microsoft ASP.NET 1.xMicrosoft ASP.NET 2.0 摘要:了解 ASP.NET 2.0 中的用于生成自定义数据绑定控件的工具是如何演变的.   本页内容 为什么需要新的数据源模型  ASP.NET 2.0 中的数据绑定控件  分析要点  数据绑定机制   列表控件  HeadlineList 示例控件  管理自定义集合  关于复合控件的一点讨论  小结 为什么需要新的数据源模型数据绑定是开发人员在 ASP.NET 1.x 中发

数据绑定技术—如何使用DataBinder.Eval()方法进行数据绑定

<%@ Import Namespace="System.Data" %> <%@ Import Namespace="System.Data.SqlClient" %> <html> <script language="C#" runat="server"> void Page_Load(Object semder, EventArgs e) { // 创建数据库连接字符串及S

在ASP.NET 2.0中数据绑定的实现方法

1.为什么ASP.NET 2.0中的数据绑定控件不需要写代码就能完成更新.删除.新建等数据操作? ASP.NET 1.x时,DataGrid等控件使用DataBinder.Eval(Container.DataItem,"ColumnName")这样的表达式可以将数据源中的数据绑定到控件上,但并不能在更新数据时自动将控件中的新值取出,更新回数据库.所以ASP.NET 2.0中的数据绑定分为两种:单向数据绑定(即表达式或ReadOnly设为True的BoundField,只提供从数据源到

总结Visual Studio下ASP.NET模板化控件中的数据绑定_实用技巧

在模板化控件中绑定到数据FormView.DataList.Repeater 和 ListView Web 服务器控件使用模板显示数据和检索用户输入,以插入.更新或删除数据.此外,您还可以将模板与 GridView 和 DetailsView 控件一同使用,以自定义数据布局. 通过将模板化控件的 DataSourceID 属性设置为数据源控件的 ID,可以将模板化控件绑定到数据源控件(例如 LinqDataSource.ObjectDataSource 或 SqlDataSource 控件).然

ASP.NET框架中的数据绑定概要与数据绑定表达式的使用_实用技巧

<%# %> 语法 ASP.NET 介绍了一种新的声明性语法 <%# %>.该语法是在 .aspx 页中使用数据绑定的基础.所有数据绑定表达式都必须包含在这些字符中.下面的列表包含从多个源进行简单数据绑定的示例: 简单属性(用于客户的语法): <%# custID %> 集合(用于订单的语法): <asp:ListBox id="List1" datasource='<%# myArray %>' runat="serve

一起谈.NET技术,在ASP.NET 2.0中数据绑定的实现方法

1.为什么ASP.NET 2.0中的数据绑定控件不需要写代码就能完成更新.删除.新建等数据操作? ASP.NET 1.x时,DataGrid等控件使用DataBinder.Eval(Container.DataItem,"ColumnName")这样的表达式可以将数据源中的数据绑定到控件上,但并不能在更新数据时自动将控件中的新值取出,更新回数据库.所以ASP.NET 2.0中的数据绑定分为两种:单向数据绑定(即表达式或ReadOnly设为True的BoundField,只提供从数据源到