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

原创 2007年09月20日 09:25:00
本文假设你已经了解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简化为:(去掉了类型指定, Eval通过反射实现,本文不再阐述)

<%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %>

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

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

 本文假设你已经了解ASP.NET 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进。   ASP.NET 2.0 的数据绑定函数Eval...
  • zjxlxzs1
  • zjxlxzs1
  • 2007年08月13日 17:35
  • 252

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

本文假设你已经了解ASP.NET 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进。   ASP.NET 2.0 的数据绑定函数Eval(...
  • wazhpi
  • wazhpi
  • 2008年12月24日 15:45
  • 373

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

本文假设你已经了解ASP.net 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进。        ASP.NET 2.0 的数据绑定函数...
  • IT_lover
  • IT_lover
  • 2006年08月30日 11:48
  • 644

Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用

 “/vs2005”应用程序中的服务器错误。------------------------------------------------------------------------------...
  • ycyangcai
  • ycyangcai
  • 2007年04月29日 23:11
  • 9937

解决Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下文中使用

在FormView里放置了一个DropDownList在绑定的时候设定SelectedValue=,运行时提示:Eval()、XPath() 和 Bind() 这类数据绑定方法只能在数据绑定控件的上下...
  • jam_li
  • jam_li
  • 2007年03月22日 15:38
  • 10049

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

 本文假设你已经了解ASP 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进。   ASP.NET 2.0 的数据绑定函数Eval()简化...
  • eunsikehuang
  • eunsikehuang
  • 2008年10月11日 19:29
  • 183

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

  • zgqtxwd
  • zgqtxwd
  • 2008年04月24日 06:31
  • 80

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

Author: Walkdan  本文假设你已经了解ASP 1.1的数据绑定(特别是Container这个局部变量)的机制,这里主要分析ASP 2.0数据绑定做了那些改进。 ASP.NET 2.0 的...
  • kyouken2007
  • kyouken2007
  • 2007年04月20日 13:05
  • 436

数据绑定Eval与Bind区别

使用数据绑定语法,可以将控件属性值绑定到数据,并指定值以对数据进行检索、更新、删除和插入操作。 数据绑定语法          数据绑定表达式包含在  分隔符之内,并使用 Eval 和 Bind ...
  • nuptsv_ice
  • nuptsv_ice
  • 2014年04月21日 16:55
  • 930

asp.net2.0数据绑定之Eval和Bind区别

例如:        >      >                   Eval是asp.net1.1中常用的绑定语法,它是“单向”的,即绑定时把数据源上相应的值赋到该控件上,Eval的任务就完...
  • sweetsoft
  • sweetsoft
  • 2008年11月19日 21:50
  • 669
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ASP.NET2.0 数据绑定函数Eval()的机制
举报原因:
原因补充:

(最多只允许输入30个字)