典型应用
在利用ASP.NET 2.0技术进行服务器控件开发过程中,有很多方面可以用到视图状态。常见的是利用ViewState字典实现服务器控件属性。ViewState是System.Web.UI.StateBag类型-一个键/值对的字典,服务器控件的属性值可以存储在ViewState中。下面通过一个典型示例,说明ViewState的应用方法。
在自定义服务器控件LabelInViewState中,实现了两个属性Text和TextInViewState。前者使用私有变量创建,后者使用ViewState实现。它们都用于获取或者设置文本内容。自定义控件实现文件LabelInViewState.cs源代码如下所示。
| using System;using System.Collections.Generic; using System.ComponentModel;using System.Text; using System.Web; using System.Web.UI; using System.Web.UI.WebControls;namespace WebControlLibrary{ [DefaultProperty("Text")] [ToolboxData("<{0}:LabelInViewState runat=server></{0}:LabelInViewState>")] public class LabelInViewState : WebControl { private string _text; //实现Text属性 public string Text { get { return (_text == null) ? string.Empty : _text; } set { _text = value; } } //使用ViewState实现TextInViewState属性 public string TextInViewState { get { String s = (String)ViewState["TextInViewState"]; return ((s == null) ? String.Empty : s); } set { ViewState["TextInViewState"] = value; } } // 重写RenderContents方法 protected override void RenderContents(HtmlTextWriter output) { output.Write("Text = "); output.Write(Text); output.Write("<br/>"); output.Write("TextInViewState = "); output.Write(TextInViewState); } } } |
如上代码所示,控件实现了两个属性Text和TextInViewState。Text属性使用了私有变量_text创建,这种实现无法保持该属性的状态信息。TextInViewState属性使用了ViewState,其通过set访问器,将属性值写入ViewState["TextInViewState"]对象中,通过get访问器,从对象ViewState["TextInViewState "]中获取属性值。这就是视图状态处理最简单的方法。当使用ViewState作为属性存储时,自定义服务器控件可以自行完成简单的状态信息管理,例如,TrackViewState、SaveViewState、LoadViewState等。当然,开发人员也可以通过重写方法自定义状态管理逻辑程序。在本例中,视图状态管理过程都是由.NET框架自动完成的。
下面列举了为测试以上自定义服务器控件而创建的Default.aspx文件源代码。
| <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ Register Namespace="WebControlLibrary" Assembly="WebControlLibrary" TagPrefix="sample" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <script runat="server"> void Button1_Click(object sender, EventArgs e) { demoLabel.Text = TextBox1.Text; demoLabel.TextInViewState = TextBox2.Text; } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="server"> <title>使用视图状态ViewState</title> </head> <body style="font-size: small;"> <form id="form1" runat="server"> <div> 姓名: |
以上代码显示在页面中包括两个文本框,两个按钮,以及一个自定义服务器控件LabelInViewState。如事件处理程序Button1_Click所示,当单击"提交"按钮时,LabelInViewState控件将获取文本框中文本,并显示出来。应用程序效果图如图1和图2所示。
![]() 图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新增的,与视图状态极为类似的技术特性--控件状态--它就能够很好的解决禁用视图状态的问题。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!






