|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
归根到底,Java跨平台可以,但是要重新编写代码,否则还分什么J2EE/J2SE/J2ME呢!asp.net|服务器|控件 在后面的系列文章中,我们已经先容了视图形态和控件形态的基础观点和典范使用,从中能够发明,视图形态和控件形态关于自界说服务器控件完成的主要性。本文将持续这一主题,重点先容完成视图形态和控件形态自界说办理的办法。
自界说视图形态办理
在先容视图形态时,我们已经提到过:关于复杂属性,比方,String、Int等范例,.NET实行引擎将主动启用默许视图形态办理机制,以便完成响应的功效。但是,假如开辟职员在ViewState中保留的是自界说数据范例,大概必要完成自界说体例优化视图形态办理时,则必需完成自界说视图形态办理。
完成自界说视图形态办理能够经由过程两种办法。办法一:完成System.Web.UI定名空间中的IStateManager接口成员,个中包含IsTrackingViewState属性和TrackViewState、SaveViewState和LoadViewState办法。这类办法次要是针对自界说数据范例的视图形态办理的情形。办法二:重写Control基类的3个视图形态办理办法:TrackViewState、SaveViewState和LoadViewState。这些办法与IStateManager接口界说的3个办法称号分歧。这类办法次要用于经由过程自界说体例优化默许视图形态办理的情形,其次要目标在于进步效力和功能。把握以上两种完成办法的捷径是,必需深入了解.NET框架外部完成视图形态办理的历程。上面两大节内容都是有关外部完成办法的先容。每节中均有完成代码,实践就相称于实例代码。一切服务器控件的自界说视图形态办理的完成都不会偏离那些代码所表达的逻辑。当读者真正把握了那些外部完成办法,那末自界说视图形态办理的完成办法也就水到渠成了。
1、完成基于IStateManager接口的自界说视图形态办理
关于庞大属性而言,多半必要完成自界说视图形态办理,其关头是完成System.Web.UI.IStateManager接口中界说的办法和属性。上面枚举了IStateManager接口界说代码。
publicinterfaceIStateManager{boolIsTrackingViewState{get;}voidLoadViewState(objectstate);objectSaveViewState();voidTrackViewState();}
如上代码所示,IStateManager接口请求类完成IsTrackingViewState属性,和LoadViewState、SaveViewState和TrackViewState办法。IsTrackingViewState属性界说,当由类完成时,猎取一个布尔值,经由过程该值唆使服务器控件是不是正在跟踪其视图形态变动。假如服务器控件正在跟踪其视图形态变动,则为true;不然为false。SaveViewState办法界说,当由类完成时,将服务器控件的视图形态变动保留到Object中。LoadViewState办法界说,当由类完成时,加载服务器控件之前保留的控件视图形态,个中的参数state暗示包括控件保留的视图形态值的Object。TrackViewState办法界说,当由类完成时,唆使服务器控件跟踪其视图形态变动。
ViewState属性与IStateManager接口之间存在亲切接洽。ViewState属性的范例是StateBag类,StateBag类经由过程完成IStateManager接口中界说的办法和属性来介入形态办理。实在现历程以下。
publicsealedclassStateBag:IStateManager,IDictionary,ICollection,IEnumerable{
privatebool_isTrackingViewState;
privateArrayList_keys;
privateArrayList_values;
privateStateItem_item;
boolIStateManager.IsTrackingViewState{
get{return_isTrackingViewState;}
}
voidIStateManager.TrackViewState(){
_isTrackingViewState=true;
}
objectIStateManager.SaveViewState(){
_keys=newArrayList();
_values=newArrayList();
IDictionaryEnumeratormyDirctionaryEnumerator=this.GetEnumerator();
while(myDictionaryEnumerator.MoveNext()){
if(this.Item[(String)myDictionaryEnumerator.Key].IsDirty){
_keys.Add(myDictionaryEnumerator.Key);
_values.Add(myDictionaryEnumerator.Value);
}
}
if(_keys.Count>0){
returnnewPair(_keys,_values);
}
}
voidIStateManager.LoadViewState(objectsavedState){
if(savedStateisPair){
_keys=(ArrayList)tempP.First;
_values=(ArrayList)tempP.Second;
IDictionaryEnumeratormyDirctionaryEnumerator=this.GetEnumerator();
while(myDictionaryEnumerator.MoveNext()){
for(intj=0;j<_keys.Count;j++)
{
if((String)myDictionaryEnumerator.Key==_keys[j].ToString());
{
this.Item[_keys[j].ToString()].Value=(object)_values[j];
}
}
}
}
}
}
请读者注重:以上代码为表示性代码,并不是严厉意义上的完成代码。在此列出,次要是用于申明StateBag类完成IStateManager接口的逻辑历程。
经由过程下面的代码,我们能够看到:
(1)在IsTrackingViewState属性中,将该属性设置为只读,而且利用公有变量_isTrackingViewState。
(2)在TrackViewState办法中,把IsTrackingViewState属性利用的公有变量_isTrackingViewState设置为true,这唆使体系当某个StateItem增加到StateBag中,大概某个StateItem值被修正时,StateBag类就会主动将该StateItem标志为修正过即增加dirty标志。
(3)在SaveViewState办法中,轮回StateBag中的每一个StateItem,假如该StateItem被标志为dirty,那末就将其键和值分离增加到两个ArrayList中,并前往该工具。
(4)在LoadViewState办法中,实行了与SaveViewState办法相反的操纵。起首将savedState工具分化为两个保留有键和值的ArrayList,然后将个中的值加载到响应的StateItem工具中。
以上就是ViewState属性完成IStateManager接口的基础历程。一切的视图形态办理历程,都要利用以上的完成历程,因而了解以上逻辑关于深切把握自界说视图形态办理机制具有无足轻重的感化。
<P> 2、完成基于Control基类的自界说视图形态办理
假如开辟职员必要优化默许视图形态办理机制,以进步控件运转效力和功能,那末必需了解Control基类中默许视图形态办理机制。经由过程把握这个办理机制,能够仿照其处置历程以完成自界说视图形态办理。
完成基于Control基类的自界说视图形态办理,必要开辟职员完成3个办法:LoadViewState、SaveViewState和TrackViewState。它们与上一大节中先容的IStateManager接口成员办法同名,而且在办法意义上也基础不异。在此就不合错误这3个办法多做申明了。
Control基类中的默许视图形态办理机制订义了一个StateBag范例的ViewState属性,并将视图形态办理的义务托付给它。上面请看Control基类的默许形态办理的完成逻辑。
privateStateBag_viewState;
protectedvirtualStateBagViewState{
get{
if(_viewState!=null)
{
return_viewState;
}
_viewState=newStateBag(ViewStateIgnoresCase);
if(IsTrackingViewState)
_viewState.TrackViewState();
return_viewState;
}
}
protectedvirtualvoidTrackViewState(){
if(_viewState!=null){
_viewState.TrackViewState();
}
returnnull;
}
protectedvirtualobjectSaveViewState(){
if(_viewState!=null){
_viewState.SaveViewState();
}
returnnull;
}
protectedvirtualvoidLoadViewState(objectsavedState){
if(savedState!=null){
ViewState.LoadViewState(savedState);
}
}
从下面的代码能够看出:ViewState属性是StateBag范例,当_viewState不为null时,则前往_viewState;当_viewState为null时,则初始化一个StateBag范例的变量_viewState,并判别控件是不是正在跟踪其视图形态变动,假如服务器控件正在跟踪其视图形态变动,那末就挪用TrackViewState办法入手下手形态跟踪,最初前往_viewState。别的,在TrackViewState、SaveViewState、LoadViewState办法中,均利用了StateBag类中有关视图形态办理的办法。
在Control基类的默许视图形态办理过程当中,因为界说了ViewState属性为StateBag范例,以是一定利用上文中StateBag类完成视图形态办理的逻辑。假如让Control基类完成IStateManager接口中的办法和属性,那末实在现历程一定与StateBag类完成IStateManager接口迥然不同,这一定将形成反复,由此大概形成.NET框架改动IStateManager接口的会见性子。别的,在举行自界说视图形态办理的过程当中,大概呈现StateBag范例与Control基类的视图形态办理机制的抵触,那样便可能发生凌乱。而接纳今朝的这类体例,不管从天真性、承继性、可复用性,乃至从编程职员的习气上,都具有良多长处。<P> 自界说控件形态办理
视图形态与控件形态在数据办理方面不太不异。ASP.NET2.0在撑持针对复杂属性的默许视图形态办理机制的同时,还撑持自界说视图形态办理。但是,关于控件形态办理而言,则不存在默许控件形态办理机制。开辟职员必需完成自界说控件形态办理历程。本大节先容一下自界说控件形态办理的完成办法,这关于完成基于控件形态功效的工具有侧重要意义。
实践上,在后面系列文章先容控件形态的过程当中,读者已打仗了控件形态完成的内容,个中就包含自界说控件形态办理的完成。这个历程的完成与基于Control基类的自界说视图形态办理十分类似,两者都必要重写Control基类中的办法。完成自界说控件形态办理必要重写Control基类的SaveControlState和LoadControlState。上面枚举了一段复杂示例代码。
publicclassSample:Control{
privateintcurrentIndex=0;
protectedoverridevoidOnInit(EventArgse){
Page.RegisterRequiresControlState(this);
base.OnInit(e);
}
protectedoverrideobjectSaveControlState(){
returncurrentIndex!=0?(object)currentIndex:null;
}
protectedoverridevoidLoadControlState(objectstate){
if(state!=null){currentIndex=(int)state;}
}
}
完成自界说控件形态办理分为3个关头步骤:
(1)挪用RegisterRequiresControlState办法。该办法用于将自界说控件注册为具有耐久性控件形态的控件。
(2)重写SaveControlState办法。该办法用于保留自页回发到服务器后产生的任何服务器控件形态变动。
(3)重写LoadControlState办法。该办法用于从SaveControlState办法保留的上一个页哀求复原控件形态信息。
小结
本章次要先容了自界说视图形态和控件形态办理的内容。它们关于完成自界说服务器控件有侧重要意义。倡议读者起首深切了解实际常识,然后再实验举行开辟事情,如许可取得更好的进修效果。不过你如果学.net的话,你就不要选os了,这课比较底层的。你可以旁听数据库加上软件构件和中间件。(webservices和面向服务的课也应该听一听) |
|