<%# eval("productname") %>
那么,page.eval()又是如何知道"productname"是那個(gè)數(shù)據(jù)的屬性呢,即container.dataitem真的消失了嗎?
eval()是page的父類templatecontrol的方法
templatecontrol.eval()可以自動(dòng)計(jì)算出container, 機(jī)制就是從一個(gè)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);
}
}
結(jié)論: 從上面看出page.eval()在計(jì)算的時(shí)候還是引用了container.dataitem,只不過這個(gè)dataitem通過dataitem container堆棧自動(dòng)計(jì)算出來的。我認(rèn)為page.eval()看似把問題簡(jiǎn)化了,其實(shí)把問題搞得更加神秘。