在利用ASP.net 2.0技术进行服务器控件开发过程中,有很多方面可以用到视图状态。常见的是利用ViewState字典实现服务器控件属性。ViewState是System.Web.UI.StateBag类型-一个键/值对的字典,服务器控件的属性值可以存储在ViewState中。下面通过一个典型示例,说明ViewState的应用方法。
在自定义服务器控件LabelInViewState中,实现了两个属性Text和TextInViewState。前者使用私有变量创建,后者使用 ViewState实现。它们都用于获取或者设置文本内容。自定义控件实现文件LabelInViewState.cs源代码如下所示。
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);
}
}
}
下面列举了为测试以上自定义服务器控件而创建的Default.aspx文件源代码。
<%@ 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> 姓名:XML:namespace prefix = asp />


如图1所示,当用户在两个文本框中填写了文本,并单击"提交"按钮引发页面回传。此时,填写的文本内容将提交到服务器,并参与 Button1_Click事件处理程序。这样,LabelInViewState控件则显示出了Text和TextInViewState属性值。之后,当用户单击"重载"按钮时,文本框内容仍然提交到服务器,但是,由于没有对应的事件处理程序,因此,LabelInViewState控件只显示已经存在的状态信息(即单击提交按钮之后保存的状态),即Text属性值为空,而TextInViewState属性值为tom@tom.com。通过以上过程可知,TextInViewState属性值都存储在视图状态ViewState中,因此,在页面往返过程中,该属性值得以保持,而Text只简单使用了私有变量,所以状态信息无法保持。另外,需要注意的是,由于默认情况下,页面启用了视图状态EnableViewState = "true",才能实现以上效果。
小结
本文主要介绍了视图状态的基本概念,并通过一个典型示例说明了应用方法。可能部分读者已经认识到,如果禁用了页面或者控件的视图状态,即设置EnableViewState = "false",那么上文服务器控件的属性TextViewState不是不能使用了吗?这的确是视图状态的缺陷所在。然而,这并不是说就无法解决这个问题了。在下文中,笔者将介绍另外一种ASP.NET 2.0新增的,与视图状态极为类似的技术特性--控件状态--它就能够很好的解决禁用视图状态的问题。
[1] [2]
