下面图老师小编要跟大家分享ASP 2.0 数据绑定函数Eval()的机制,简单的过程中其实暗藏玄机,还是要细心学习,喜欢还请记得收藏哦!
【 tulaoshi.com - Web开发 】
Author: Walkdan (walkdan(at)gmail.com)
ASP.NET 2.0 的Eval()简化了掉了ASP 1.1 Container.DataItem,比如:
(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/webkaifa/)%# (Container.DataItem as DataRowView)["ProductName"].ToString() %
简化为:(去掉了类型指定 ASP 1.1, Eval通过反射实现,本文不再阐述)
%# DataBinder.Eval(Container.DataItem, "ProductName").ToString() %
又简化为(ASP 2.0):
%# Eval("ProductName") %
Eval()是TemplateControl:Page 的方法
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. TemplateContro.Eval()
public class TemplateControl
{
protected string Eval (string expression, string format)
{
return DataBinder.Eval (Page.GetDataItem(), expression, format);
}
}
来源:http://www.tulaoshi.com/n/20160219/1609771.html
看过《ASP 2.0 数据绑定函数Eval()的机制》的人还看了以下文章 更多>>