首页 > 编程 > ASP > 正文

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

2024-05-04 11:06:37
字体:
来源:转载
供稿:网友

最大的网站源码资源下载站,

  本文假设你已经了解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()看似把问题简化了,其实把问题搞得更加神秘。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表