|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我感觉可以顶到50楼,出乎意料的是大家居然纷纷写出自己的博文,还被编辑做成了专题,置于首页头条。asp.net|控件|视图 基础观点
控件形态-为了让控件一般事情,偶然必要存储控件形态数据。比方,假如编写了一个自界说控件,个中具有显现分歧信息的分歧选项卡,为使该控件如预期一样事情,控件必要晓得在往复过程当中选择的是哪一个选项卡。ViewState属性可用于此目标,但开辟职员大概在页级别封闭了视图形态,从而无效地中止控件。为办理此成绩,ASP.NET页框架在ASP.NET2.0版中公然了一种称为控件形态的新功效。
ControlState属性同意坚持特定于控件的属性信息,不像ViewState属性一样能够封闭。若要利用控件形态,控件必需在初始化过程当中挪用RegisterRequiresControlState办法,然后重写SaveControlState和LoadControlState办法。
视图形态-视图形态是ASP.NET页框架默许情形下用于保留往复历程之间的页和控件值的办法。当出现页的HTML情势时,必要在回发过程当中保存的页确当前形态和值将被序列化为Base64编码的字符串,并输入到视图形态的埋没字段中。经由过程完成自界说的PageStatePersister类以存储页数据,您能够变动默许举动并将视图形态存储到另外一个地位(如SQLServer数据库)。有关将页形态存储到流上而不是埋没的页字段中的示例,请拜见视图形态耐久性机制的示例。
您能够经由过程利用页的ViewState属性将往复过程当中的数据保留到Web服务器来使用本人的代码会见视图形态。ViewState属性是一个包括密钥/值对(个中包括视图形态数据)的字典。
各自的上风与优势
视图形态
利用视图形态的长处:
・不必要任何服务器资本视图形态包括在页代码内的布局中。
・完成复杂视图形态无需利用任何自界说编程。默许情形下对控件启用形态数据的保护。
・加强的平安功效视图形态中的值经由哈希盘算和紧缩,而且针对Unicode完成举行编码,其平安性要高于利用埋没域。
利用视图形态的弱点
・功能注重事项因为视图形态存储在页自己,因而假如存储较年夜的值,用户显现页和发送页时的速率大概会减慢。特别是对挪动设备,其带宽一般是无限的。
・设备限定挪动设备大概没有充足的内存容量来存储大批的视图形态数据。
・潜伏的平安风险视图形态存储在页上的一个或多个埋没域中。固然视图形态以哈希格局存储数据,但它能够被改动。假如间接检察页输入源,能够看到埋没域中的信息,这招致潜伏的平安性成绩。
控件形态
利用控件形态的长处:
・不必要任何服务器资本默许情形下,控件形态存储在页上的埋没域中。
・牢靠性由于控件形态不像视图形态那样能够封闭,控件形态是办理控件的形态的更牢靠办法。
・通用性能够编写自界说适配器来把持怎样存储控件形态数据和控件形态数据的存储地位。
利用控件形态的弱点:
・必要一些编程固然ASP.NET页框架为控件形态供应了基本,可是控件形态是一个自界说的形态坚持机制。为了充实使用控件形态,您必需编写代码来保留和加载控件形态。
<P> 控件形态与视图形态示例
此示例演示怎样创立一个名为IndexButton的自界说控件,该控件利用控件形态在多个页哀求间保护关头形态信息。在ASP.NET2.0版中引进的控件形态与视图形态相似,但功效上自力于视图形态。网页开辟职员大概会出于功能缘故原由而禁用全部页面或单个控件的视图形态,但他们不克不及禁用控件形态。控件形态是专为存储控件的主要数据(如一个页面控件的页数)而计划的,回发时必需用到这些数据才干使控件一般事情(即使禁用视图形态也不受影响)。默许情形下,ASP.NET页框架将控件形态存储在页的一个埋没元素中,视图形态也一样存储在此埋没元素中。即便禁用视图形态,或是利用Session办理形态时,页面中的控件形态仍会传输至客户端,然后前往到服务器。在回发时,ASP.NET会对埋没元素的内容举行反序列化,并将控件形态加载到每一个注册过控件形态的控件中。
此示例阐释了一个同时在控件形态和视图形态中保留形态的自界说控件。在此示例中,IndexButton控件派生自Button类,还界说了一个Index属性,并将该属性保留在控件形态中。为了举行对照,IndexButton还界说了一个IndexInViewState属性,该属性存储在ViewState字典中。为了懂得控件形态和视图形态之间的差别,请利用本文附带的程序来演示IndexButton控件。
IndexButton控件源码
usingSystem;
usingSystem.ComponentModel;
usingSystem.Security.Permissions;
usingSystem.Web;
usingSystem.Web.UI;
usingSystem.Web.UI.WebControls;
namespaceCustomerControls
{
[
AspNetHostingPermission(SecurityAction.Demand,Level=AspNetHostingPermissionLevel.Minimal),
AspNetHostingPermission(SecurityAction.InheritanceDemand,Level=AspNetHostingPermissionLevel.Minimal),
ToolboxData("<{0}:IndexButtonrunat="server"></{0}:IndexButton>")
]
publicclassIndexButton:Button
{
privateintindexValue;
[
Bindable(true),
Category("Behavior"),
DefaultValue(0),
Description("Theindexstoredincontrolstate.")
]
publicintIndex
{
get
{
returnindexValue;
}
set
{
indexValue=value;
}
}
[
Bindable(true),
Category("Behavior"),
DefaultValue(0),
Description("Theindexstoredinviewstate.")
]
publicintIndexInViewState
{
get
{
objectobj=ViewState["IndexInViewState"];
return(obj==null)?0:(int)obj;
}
set
{
ViewState["IndexInViewState"]=value;
}
}
protectedoverridevoidOnInit(EventArgse)
{
base.OnInit(e);
Page.RegisterRequiresControlState(this);
}
protectedoverrideobjectSaveControlState()
{
//挪用基类的办法,从基类失掉控件形态的基值
//假如indexValue不即是而且基类的控件形态不为null
//利用Pair作为便当的数据布局来高效保留(和在LoadControlState办法中复原)
//由两部分构成的控件形态
objectobj=base.SaveControlState();
if(indexValue!=0)
{
if(obj!=null)
{
returnnewPair(obj,indexValue);
}
else
{
return(indexValue);
}
}
else
{
returnobj;
}
}
protectedoverridevoidLoadControlState(objectstate)
{
if(state!=null)
{
Pairp=stateasPair;
if(p!=null)
{
base.LoadControlState(p.First);
indexValue=(int)p.Second;
}
else
{
if(stateisint)
{
indexValue=(int)state;
}
else
{
base.LoadControlState(state);
}
}
}
}
}
}
代码会商
IndexButton控件的完成阐释了三个义务,必需实行这三个义务才干使控件介入控件形态:
・重写OnInit办法并挪用RegisterRequiresControlState办法向页面注册,以介入控件形态。必需针对每一个哀求完成此义务。
・重写SaveControlState办法,以在控件形态中保留数据。
・重写LoadControlState办法,以从控件形态加载数据。此办法挪用基类办法,并猎取基类对控件形态的基值。假如indexValue字段不为零,并且基类的控件形态也不为空,Pair类即可作为便利的数据布局利用,用来保留和复原由两部分构成的控件形态。
剖析总结
从MSDN上的一系列的手艺参考来看,ControlState应当是次要在自界说控件上利用,“ASP.NET页框架供应了ControlState属性作为在服务器往复过程当中存储自界说控件数据的办法”,这是MSDN上的原句,ASP.NET2.0只是为ControlState供应了一个基本,当ControlState是一个自界说的形态坚持机制,也就是说坚持形态的机制必要你开辟职员本人往完成,而不像ViewState,它有本人默许的形态坚持机制。在自界说控件利用ControlState大概才是微软本意了,为的就制止在页面级别禁用失落ViewState后,自界说控件还能一般运转。固然这里的意义就是,某些控件的准确运转是依附于它的形态信息的,在ASP.NET1.1中,假如禁用了ViewState,如许的控件就没法准确运转了。但引进了ControlState后就分歧了,由于ControlState是禁用不失落的。
以是微软才提示开辟职员“请仅对那些在回发过程当中对控件相当主要的大批关头数据利用控件形态,而不要将控件形态作为视图形态的备用选项利用”。明白说出,ControlState和ViewState完整是两个器材,固然它们能够完成不异的义务,新推出的ControlState既不是用来替换ViewState也不是用来做ViewState的替补。它的任务是填补ViewState的所不克不及完成的义务,闪开发职员开辟出加倍强健的控件。比方说,开辟的自界说控件某个形态是相当主要的,短少它就自界说控件不克不及一般事情,那末ControlState就该上场了。并且ControlState是自界说的形态坚持机制,也限定了ControlState自在的利用,你不仅要在OnInit办法并挪用RegisterRequiresControlState办法向页面注册,并且要重写SaveAdapterControlState(),LoadAdapterControlState(objectstate)两个办法本人往完成要保留甚么,如何保留。依据我如今的了解,假如你必要保留该控件的10种分歧形态,那你就得逐一保留,再逐一加载上往。从这点也就看出了微软的初志了,那不是很分明吗,假如不必要ControlState那就不利用它吧,不然怎样它甚么都让我们开辟职员往做呢?
这只是基本了,方才我说了,仿佛微软也是这么说的,ControlState针对的是自界说控件,实在我们真的要往开启基础控件比方Label控件的ControlState,微软也是同意的,这就是稍深的内容了,这就触及到控件适配器了(ControlAdapter)。假如必要懂得这方面的内容,请看用控件适配器开启基础控件的ControlState。http://sifang2004.cnblogs.com/archive/2006/06/01/415288.html
附录
为了加倍充实了解下面的内容,必要对以下内容有个懂得:
Pair类
用作存储两个相干工具的基础布局。它是在全部ASP.NET中(在如页面形态办理义务时代或设置节处置程序的过程当中)有多种用法的有用工具类。能够在本人的代码中必要包括两个相干工具的布局的恣意地位和纷歧定必要数据绑定的地位利用Pair类。Pair类不将其工具援用First和Second封装在属性中;该类间接将它们作为大众类字段公然到一切挪用代码。
Pair类在页形态保存完成中有多种用法。最多见的用法是同时作为ViewState和ControlState汇合的容器。在这类情形下,First属性用于ViewState,而Second用于ControlState。
PageStatePersister类
HTTP哀求和呼应底本是无形态的。要在HTTP哀求之间坚持形态信息,ASP.NET服务器页能够存储Page形态。此形态称为视图形态,它包括页和控件设置及数据,这些设置和数据使得页和控件看起来就像在上一次将它们提交到服务器然后又前往到客户端时,用户所看到并与之交互的页和控件一样。有几种机制可在对不异页的一连哀求之间存储视图形态。PageStatePersister笼统类暗示这些形态信息存储机制的基类。
要在不克不及撑持现有视图形态耐久性机制的客户端上保存视图形态,能够扩大PageStatePersister类,引进您本人的视图形态耐久性办法,而且可使用页适配器将ASP.NET使用程序设置为依据为其供应页的客户真个范例利用分歧的视图形态耐久性机制。从PageStatePersister类派生的类必需重写Save笼统办法,以便在耐久性介质中存储视图形态和控件形态,同时重写Load办法以提取形态信息。假如想晓得怎样写PageStatePersister的派生类,请参考视图形态耐久性机制。
另外,小型软件代码重用价值低,没有必要跨平台;大型软件,有严格的规划、部署,不可以随意跨平台。 |
|