All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
使用ASP.Net,Forms模式实现WebService身份验证_.net资料_编程技术
ASP.NET,2.0,页面状态持续程序实例_.net资料_编程技术
sqlserver无法安装_[SQL,Server教程]
在ASP.NET,2.0中建立站点导航层次_[Asp.Net教程]
ajax代理程序自动判断字符编码_[AJAX教程]
总结优化SQL Server数据库查询的方法_[SQL Server教程]
Asp.net三层结构中的变量引用与传递_[Asp.Net教程]
ASP.NET,2.0中的Web和HTML服务器控件_[Asp.Net教程]
在C#中使用帮助文件
PHP基础:详解Apache中.htaccess文件的功能写法_php资料_编程技术
Reading number is top 10 pictures
Beautiful Japanese beauty(漂亮的日本美女)
Sell the barbecue as says father du breul4
Look for from human art net, is good--3
Extremely rare TianShan Mountains snow lotus2
Wild animals melee moment of life and death1
运动的范冰冰3
9.3阅兵全景图1-抗战老兵和英雄连队梯队
Seductive beauty of crime2
这两天,中国人民到处都可以“看海”了
美女和狗狗2
Download software ranking
Unix video tutorial9
Ashlynn Video1
The Bermuda triangle1
美女写真1
塘西风月痕
Unix video tutorial13
C#COM编程指南
好色的外科大夫
致我们终将逝去的青春
Love the forty days
delv published in(发表于) 2014/1/6 8:47:33 Edit(编辑)
ASP,2.0,数据绑定函数Eval()的机制_[Asp.Net教程]

ASP,2.0,数据绑定函数Eval()的机制_[Asp.Net教程]

ASP 2.0 数据绑定函数Eval()的机制_[Asp.Net教程]

本文假设你已经了解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()看似把问题简化了,其实把问题搞得更加神秘。
作者:Walkdan 来源:博客园





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.