九泉怪物分布,韩国成人小游戏,濮阳李平安
假设你已经了解asp.net eval 1.1的数据绑定(特别是container这个局部变量)的机制,这里主要分析asp.net eval 2.0数据绑定做了那些改进.
asp.net eval 2.0 的数据绑定函数eval()简化掉了asp.net eval 1.1神秘的container.dataitem,比如数据绑定表达式:
<%# eval("productname") %>
那么,page.eval()又是如何知道"productname"是那个数据的属性呢,即container.dataitem真的消失了吗?
asp.net eval()是page的父类templatecontrol的方法
templatecontrol.eval()可以自动计算出container, 机制就是从一个databindingcontext:stack堆栈来获取.
1. 建立dataitem container 栈:
在control.databind()中,建立,这样可以保证子控件的dataitem container始终在栈顶.
{
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弹出堆栈
}
}
}
{
public object getdataitem()
{
...
return this._databindingcontext.peek(); <-- 读取堆栈顶部的dataitem container,就是正在绑定的dataitem container
}
}
{
protected string eval (string expression, string format)
{
return databinder.eval (page.getdataitem(), expression, format);
}
}
从上面看出page.eval()在计算的时候还是引用了container.dataitem,只不过这个dataitem通过dataitem container堆栈自动计算出来的.我认为page.eval()看似把问题简化了,其实把问题搞得更加神秘.
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
asp.net搭建博客,使用BlogEngine.NET+MySql搭建博客
网友评论