实际上eval方法是templatecontrol的,而system.web.ui.page和system.web.ui.usercontrol都继承于templatecontrol,所以我们可以在page和usercontrol上直接调用个方法。
page.eval方法可以帮助我们更好的撰写数据绑定表达式,在asp.net 1.x时代,数据绑定表达式的一般形式是: <%# databinder.eval( container , “dataitem.name”) %> 而在asp.net 2.0中,同样的代码,我们可以这样写: <%# eval( “name” )%> asp.net 2.0是怎么实现的呢?我们先从eval方法来研究,通过反射.net framework 2.0类库的源代码,我们可以看到这个方法是这样实现的: protected internal object eval(string expression) { this.checkpageexists(); return databinder.eval(this.page.getdataitem(), expression); } 第一行我们不必管,这是检查调用的时候有没有page对象的,如果没有则会抛出一个异常。 关键是第二行: return databinder.eval(this.page.getdataitem(), expression); page.getdataitem()也是2.0中新增的一个方法,用途是正是取代asp.net 1.x中的container.dataitem。 看来不摸清楚getdataitem()方法,我们也很难明白eval的原理。getdataitem的实现也很简单: public object getdataitem() { if ((this._databindingcontext == null) (this._databindingcontext.count == 0)) { throw new invalidoperationexception(sr.getstring("page_missingdatabindingcontext")); } return this._databindingcontext.peek(); } 我们注意到了有一个内部对象_databindingcontext,通过查源代码发现这是一个stack类型的东西。所以他有peek方法。而这一段代码很容易看懂,先判断这个stack是否被实例化,然后,判断这个stack里面是不是有任何元素,如果stack没有被实例化或者没有元素则抛出一个异常。最后是将这个堆栈顶部的元素返回。 asp.net 2.0用了一个stack来保存所谓的dataitem,我们很快就查到了为这个堆栈压元素和弹出元素的方法:control.databind方法: protected virtual void databind(bool raiseondatabinding) { bool flag1 = false;//这个标志的用处在上下文中很容易推出来,如果有dataitem压栈,则在后面出栈。 if (this.isbindingcontainer)//判断控件是不是数据绑定容器,实际上就是判断控件类是不是实现了inamingcontainer { bool flag2; object obj1 = databinder.getdataitem(this, out flag2);//这个方法是判断控件是不是有dataitem属性,并把它取出来。 if (flag2 && (this.page != null))//如果控件有dataitem { this.page.pushdatabindingcontext(obj1);//把dataitem压栈,pushdatabindingcontext就是调用_databindingcontext的push方法 flag1 = true; } } try { if (raiseondatabinding)//这里是判断是不是触发databinding事件的。 { this.ondatabinding(eventargs.empty); } this.databindchildren();//对子控件进行数据绑定,如果这个控件有dataitem,则上面会将dataitem压入栈顶,这样,在子控件里面调用eval或者getdataitem方法,就会把刚刚压进去的dataitem给取出来。 } finally { if (flag1)//如果刚才有压栈,则现在弹出来。 { this.page.popdatabindingcontext();//popdatabindingcontext就是调用_databindingcontext的pop方法 } } } 至此,我们已经可以完全了解asp.net 2.0中getdataiten和eval方法运作的原理了,下一次我打算研究asp.net 2.0中的新的bind语法。 有提供bind语法资料的和提出好建议的酌情给分,up、顶等分会很少,接分者无分。Java Asp PHP .Net XML C/C++ CGI VB Jsp J2ee J2se J2me EJB Servlet Tomcat Resin Struts Weblogic Eclipse ANT GUI JMS Web servise IDEA Webphere Hibernate Spring Jboss Applet Swing Socket Javamail Perl Ajax P2P 安全 模式 框架 测试 开源 游戏
Windows XP Windows 2000 Windows 2003 Windows Me Windows 9.x Linux UNIX 注册表 操作系统 服务器 应用服务器