ASP 2.0 数据绑定函数Eval()的机制

函数|数据

  本文假设你已经了解ASP 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进。

  ASP.NET 2.0 的数据绑定函数Eval()简化掉了ASP 1.1神秘的Container.DataItem,比如数据绑定表达式:

<%# (Container.DataItem as DataRowView)["ProductName"].ToString() %>
  ASP 1.1简化为:(去掉了类型指定, Eval通过反射实现,本文不再阐述)

<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>
  ASP 2.0又简化为,去掉了Container局部变量:

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

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

时间: 2024-09-27 09:25:34

ASP 2.0 数据绑定函数Eval()的机制的相关文章

ASP.NET2.0 数据绑定函数Eval()的机制

本文假设你已经了解ASP.NET 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进. ASP.NET 2.0 的数据绑定函数Eval()简化掉了ASP 1.1神秘的Container.DataItem,比如数据绑定表达式: <%# (Container.DataItem as DataRowView)["ProductName"].ToString() %>  ASP.NET 1.1简化为:(去掉了类型指定, E

asp.net 数据绑定 使用eval 时候报 字符文本中的字符太多 问题的解决方法

在使用datalist 数据绑定时: 复制代码 代码如下: <asp:TextBox ID="txtOutPlace" runat="server" Text ="<%#Eval('调出单位存放地点')%>" Width="130px"></asp:TextBox> 运行报"字符文本中的字符太多"的错误,这时是因为Eval必须是字符串(""引起来)不能

c++-C++ 6.0关于函数的消息映射机制的发问

问题描述 C++ 6.0关于函数的消息映射机制的发问 看了一些文章介绍,C++ 6.0的消息映射以后,函数接收到消息处理以后就返回系统控制权了,但是能得到当前消息的上一个消息么?我想知道这个消息是否执行过了 解决方案 http://blog.csdn.net/hxh129/article/details/9313897

asp.net 数据绑定 使用eval 时候报 “字符文本中的字符太多” 问题解决

在使用datalist 数据绑定时:   <asp:TextBox ID="txtOutPlace" runat="server" Text ="<%#Eval('调出单位存放地点')%>" Width="130px"></asp:TextBox> 运行报"字符文本中的字符太多"的错误,这时是因为Eval必须是字符串(""引起来)不能用单引号,这是表面

数据绑定控件再ASP.NET1.X和ASP.NET2.0的区别

asp.net|控件|区别|数据 数据绑定在ASP.NET2.0里进一步得到简化,绑定控件的基类来自于BaseDataBoundControl,你可以到http://msdn2.microsoft.com/en-us/library/system.web.ui.webcontrols.basedataboundcontrol_members(VS.80).aspx查看该类如果你查看该类的成员,请注意下面两个属性和方法 virtual object DataSource  { get; set;

asp.net4.0框架下验证机制失效的原因及处理办法_实用技巧

ASP.NET请求验证功能为我们提供应用程序的安全保证,避免站点受到XSS跨站脚本攻击.但在有些时候,比如我们需要使用Ckeditor等在线文本编辑器让用户输入一些HTML文本,在ASP.NET 2.0框架下,通过在web.config中设置validateRequest="false".或者在MVC中,我们可以通过在Controller或者Action上设置[ValidateRequest(false)]这个特性来达到禁用的目的.但是在ASP.NET 4.0框架下,你会发现,即使你这

ASP.NET2.0数据操作之母板页和站点导航

asp.net|导航|数据|站点 导言 通常,用户友好的个性化站点都有着一致的,站点统一的页面布局和导航体系.Asp.net 2.0引入的两个新特性给我们在统一站点的页面布局和站点导航上提供了简单而有效的工具,它们是母板页和站点导航.母板页允许开发者创建统一的站点模板和指定的可编辑区域.这样,aspx页面只需要给模板页中指定的可编辑区域提供填充内容就可以了,所有在母板页中定义的其他标记将出现在所有使用了该母板页的aspx页面中.这种模式允许开发者可以统一的管理和定义站点的页面布局,因此可以容易的

ASP.NET4.0新特性

原文:ASP.NET4.0新特性 在以前试用VS2010的时候已经关注到它在Web开发支持上的一些变化了,为此我还专门做了一个ppt,当初是计划在4月12日那天讲的,结果因为莫名其妙的原因导致没有语音以致放弃在LiveMeeting上的这次讲课,也导致了本篇的产生. 新增了项目模板 在创建Web项目时可以看到增加了更多的Web项目模板在VS2008中对应的情况如下: 在新模板中有如下改进:基础MemberShip功能.在大多数网站和应用程序中需要进行认证,因此在新模板中增加了认证功能使得用户能在

ASP.NET2.0的控件状态和视图状态探讨

asp.net|控件|视图 基本概念 控件状态-为了让控件正常工作,有时需要存储控件状态数据.例如,如果编写了一个自定义控件,其中具有显示不同信息的不同选项卡,为使该控件如预期一样工作,控件需要知道在往返过程中选择的是哪个选项卡.ViewState 属性可用于此目的,但开发人员可能在页级别关闭了视图状态,从而有效地中断控件.为解决此问题,ASP.NET 页框架在 ASP.NET 2.0 版中公开了一种称为控件状态的新功能. ControlState 属性允许保持特定于控件的属性信息,不像 Vie