author: walkdan (walkdan(at)gmail.com)
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):
<%# 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.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!


