仓酷云
标题:
来一篇关于NET的实例:ASP.NET Eval怎样撰写数据库绑定表达式
[打印本页]
作者:
因胸联盟
时间:
2015-1-16 14:25
标题:
来一篇关于NET的实例:ASP.NET Eval怎样撰写数据库绑定表达式
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)ASP.NETEval能够用于数据库绑定,不外,详细操纵仿佛对照烦琐,上面我们就来先容一种关于ASP.NETEval匡助撰写数据库绑定表达式的办法。
实践上ASP.NETEval办法是TemplateControl的,而System.Web.UI.Page和System.Web.UI.UserControl都承继于TemplateControl,以是我们能够在Page和UserControl上间接挪用个办法。
Page.Eval办法能够匡助我们更好的撰写数据绑定表达式,在ASP.NETEval1.x时期,数据绑定表达式的一样平常情势是:
<%#DataBinder.Eval(Container,“DataItem.Name”)%>
而在ASP.NETEval2.0中,一样的代码,我们能够如许写:
<%#Eval(“Name”)%>
ASP.NETEval2.0是怎样完成的呢?我们先从Eval办法来研讨,经由过程反射.NETfromwork2.0类库的源代码,我们能够看到这个办法是如许完成的:
protectedinternalobjectEval(stringexpression)
{
this.CheckPageExists();
returnDataBinder.Eval(this.Page.GetDataItem(),expression);
}
第一行我们不用管,这是反省挪用的时分有无Page工具的,假如没有则会抛出一个非常。关头是第二行:
returnDataBinder.Eval(this.Page.GetDataItem(),expression);
Page.GetDataItem()也是2.0中新增的一个办法,用处是恰是代替ASP.NETEval1.x中的Container.DataItem。
看来不摸分明GetDataItem()办法,我们也很难懂白ASP.NETEval的道理。GetDataItem的完成也很复杂:
publicobjectGetDataItem()
{
if((this._dataBindingContext==null)||(this._dataBindingContext.Count==0))
{
thrownewInvalidOperationException(SR.GetString("Page_MissingDataBindingContext"));
}
returnthis._dataBindingContext.Peek();
}
我们注重到了有一个外部工具_dataBindingContext,经由过程查源代码发明这是一个Stack范例的器材。以是他有Peek办法。而这一段代码很简单看懂,先判别这个Stack是不是被实例化,然后,判别这个Stack内里是否是有任何元素,假如Stack没有被实例化大概没有元素则抛出一个非常。最初是将这个仓库顶部的元素前往。
ASP.NETEval2.0用了一个Stack来保留所谓的DataItem,我们很快就查到了为这个仓库压元素和弹出元素的办法:Control.DataBind办法:
protectedvirtualvoidDataBind(boolraiseOnDataBinding)
{
boolflag1=false;//这个标记的用途在高低文中很简单推出来,假如有DataItem压栈,则在前面出栈。
if(this.IsBindingContainer)//判别控件是否是数据绑定容器,实践上就是判别控件类是否是完成了INamingContainer
{
boolflag2;
objectobj=DataBinder.GetDataItem(this,outflag2);//这个办法是判别控件是否是有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.NETEval2.0中GetDataIten和Eval办法运作的道理了
关于效力:
无庸置疑的是强范例转换Container的效力是最高的,ASP.NETEval终极是挪用DataBinder.Eval办法,DataBinder.Eval是接纳反射来猎取数据的,这明显不如强范例数据转换。
我们能够对照一下各类办法:
((Type)Container.DataItem).Property
这类办法效力是最高的,由于不存在任何反射。
其次是:
((Type)GetDataItem()).Property
这类办法效力差的缘故原由在于多了一个Stack的Peek操纵,固然,实践上这点儿不同能够疏忽。
最初是:ASP.NETEval大概DataBinder.Eval,这两种办法都利用反射来查找属性大概索引器成员,效力年夜打扣头。
别的一个值得注重的成绩是,一切完成了INamingContainer接口的Control,都应当完成IDataItemContainer接口,由于在Control.DataBind的时分,假如发明控件完成了INamingContainer接口,就会试图往寻觅它的DataItem,假如这个控件没有完成IDataItemContainer,则DataBinder.GetDataItem办法会利用反射看看控件有无一个叫做DataItem的属性成员,明显这不是我们但愿看到的。
实在ASP.NETEval另有一个标志接口:INonBindingContainer,完成了INamingContainer接口的控件能够选择同时完成这个来命令ASP.NETEval不往寻觅DataItem,但是很惋惜,不晓得微软出于甚么目标,这个接口是internal的……
实在效力方面不用太器重了,ASP.NETEval表达式很悦目的,即便有那末极度的器重效力,GeDataItem也是不错的选择。无庸置疑的是强范例转换Container的效力是最高的,Eval终极是挪用DataBinder.Eval办法,DataBinder.Eval是接纳反射来猎取数据的,这明显不如强范例数据转换。
说句实话,Java跨平台根本就不是外行人想想的那种,一次编译,处处运行。
作者:
蒙在股里
时间:
2015-1-18 14:27
如今主流的Web服务器软件主要由IIS或Apache组成。IIS支持ASP且只能运行在Windows平台下,Apache支持PHP,CGI,JSP且可运行于多种平台,虽然Apache是世界使用排名第一的Web服务器平台。
作者:
若相依
时间:
2015-2-1 11:09
asp.net最主要特性包括:◆编程代码更简洁◆网站可实现的功能更强大◆运行效率高◆节省服务器的动作资源
作者:
柔情似水
时间:
2015-2-20 18:40
主流网站开发语言之PHP
HP的全名非常有趣,它是一个巢状的缩写名称——“PHP:HypertextPreprocessor”,打开缩写还是缩写。PHP是一种HTML内嵌式的语言(就像上面讲的ASP那样)。而PHP独特的语法混合了C,Java,Perl以及PHP式的新语法。它可以比CGI或者Perl更快速地执行动态网页。
作者:
透明
时间:
2015-3-6 18:57
Servlet的形式和前面讲的CGI差不多,它是HTML代码和后台程序分开的。它们的启动原理也差不多,都是服务器接到客户端的请求后,进行应答。不同的是,CGI对每个客户请求都打开一个进程(Process)。
作者:
再见西城
时间:
2015-3-13 07:09
ASP在执行的时候,是由IIS调用程序引擎,解释执行嵌在HTML中的ASP代码,最终将结果和原来的HTML一同送往客户端。
作者:
金色的骷髅
时间:
2015-3-20 16:43
但是目前在CGI中使用的最为广泛的是Perl语言。所以,狭义上所指的CGI程序一般都是指Perl程序,一般CGI程序的后缀都是.pl或者.cgi。
欢迎光临 仓酷云 (http://ckuyun.com/)
Powered by Discuz! X3.2