ASP.NET服务器控件之视图状态(2) | |||||
---|---|---|---|---|---|
http://www.sina.com.cn 2006年05月31日 10:17 天极yesky | |||||
典型应用
如上代码所示,控件实现了两个属性Text和TextInViewState。Text属性使用了私有变量_text创建,这种实现无法保持该属性的状态信息。TextInViewState属性使用了ViewState,其通过set访问器,将属性值写入ViewState["TextInViewState"]对象中,通过get访问器,从对象ViewState["TextInViewState "]中获取属性值。这就是视图状态处理最简单的方法。当使用ViewState作为属性存储时,自定义服务器控件可以自行完成简单的状态信息管理,例如,TrackViewState、SaveViewState、LoadViewState等。当然,开发人员也可以通过重写方法自定义状态管理逻辑程序。在本例中,视图状态管理过程都是由.NET框架自动完成的。 下面列举了为测试以上自定义服务器控件而创建的Default.aspx文件源代码。
以上代码显示在页面中包括两个文本框,两个按钮,以及一个自定义服务器控件LabelInViewState。如事件处理程序Button1_Click所示,当单击"提交"按钮时,LabelInViewState控件将获取文本框中文本,并显示出来。应用程序效果图如图1和图2所示。
如图1所示,当用户在两个文本框中填写了文本,并单击"提交"按钮引发页面回传。此时,填写的文本内容将提交到服务器,并参与Button1_Click事件处理程序。这样,LabelInViewState控件则显示出了Text和TextInViewState属性值。之后,当用户单击"重载"按钮时,文本框内容仍然提交到服务器,但是,由于没有对应的事件处理程序,因此,LabelInViewState控件只显示已经存在的状态信息(即单击提交按钮之后保存的状态),即Text属性值为空,而TextInViewState属性值为tom@tom.com。通过以上过程可知,TextInViewState属性值都存储在视图状态ViewState中,因此,在页面往返过程中,该属性值得以保持,而Text只简单使用了私有变量,所以状态信息无法保持。另外,需要注意的是,由于默认情况下,页面启用了视图状态EnableViewState = "true",才能实现以上效果。 小结 本文主要介绍了视图状态的基本概念,并通过一个典型示例说明了应用方法。可能部分读者已经认识到,如果禁用了页面或者控件的视图状态,即设置EnableViewState = "false",那么上文服务器控件的属性TextViewState不是不能使用了吗?这的确是视图状态的缺陷所在。然而,这并不是说就无法解决这个问题了。在下文中,笔者将介绍另外一种ASP.NET 2.0新增的,与视图状态极为类似的技术特性--控件状态--它就能够很好的解决禁用视图状态的问题。 |