|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
什么叫数据库怎么样?什么意思?你想单学数据库。(其实变成是我问的)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跨平台根本就不是外行人想想的那种,一次编译,处处运行。 |
|