选择显示字体大小

揭秘asp.net 2.0的eval方法

实际上eval方法是templatecontrol的,而system.web.ui.page和system.web.ui.usercontrol都继承于templatecontrol,所以我们可以在page和usercontrol上直接调用个方法。

page.eval方法可以帮助我们更好的撰写数据绑定表达式,在asp.net 1.x时代,数据绑定表达式的一般形式是:

<&#37;# databinder.eval( container , “dataitem.name”) &#37;>

而在asp.net 2.0中,同样的代码,我们可以这样写:

<&#37;# eval( “name” )&#37;>

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   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons