序言
在这篇文章中,我将与大家分享一些关于状态视图的概念。
状态维护
WEB无状态是状态是由于它是基于无状态的HTTP协议。默认情况下,客户端程序请求服务器里它们之间并不维持状态。不过通过一些技术可以实现状态的维持,我们下面列出了三种不同的状态类型:
- 页面级别
- 用户级别
- 应用程序级别
状态视图是属于页面级状态,其余的两个不属于本文讨论范围。
在ASP.NET里,Control.ViewState 是使控在服务器的请求与相应间保留控件的值。
状态视图如何工作?
如果你在页面上设置Form 的ViewState属性为Enabled,在浏览该页面时,查看该页面把生成的HTML代码,你将看到下列这样一段代码:
value ="DDDF22DDFD3453333D2DDDFDFD332133==" />
这个在页面自动添加的隐藏控件存储着当前页面上所有控件的值并发送给浏览器。如果页面重新载入,状态视图的两个方法就会被触发,LoadViewState() 和SaveViewState()。数据将加载到相应的控件里。
状态视图可以存些什么?
状态视图可以存储类型和对象,不过对象是可以序列化或拥有类型转换器的。序列号是把对象数据转换成一种基于流输出的一种处理,并可以通过这种基于流的数据构建一个相同的对象。在这,我们应该意识到序列化在状态视图的角色。先前,我们看见隐藏控件把存储的数据就是通过序列化的。
用户定义类型
用户可以定义它们自己的类型, 如结构、类。如果你想玩弄用户类型与状态视图,你就必需专心地定义它们。
运行下面这段代码:
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
namespace CodeProject
... {
public class WebForm1 : System.Web.UI.Page
...{
private void Page_Load(object sender, System.EventArgs e)
...{
UserClass UC=new UserClass();
this.ViewState["Key"]=UC;
Response.Write("View State is workng..");
}
Web Form Designer generated code#region Web Form Designer generated code
override protected void OnInit(EventArgs e)
...{
//
// CODEGEN: This call is required by the ASP.NET Web Form Designer.
//
InitializeComponent();
base.OnInit(e);
}
private void InitializeComponent()
...{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
public class UserClass
...{
public UserClass()
...{
_number=1;
_name="cp.com";
}
private int _number;
private string _name;
}
} </ PRE >
就会出现下列此图所示的错误:
因为这个CodeProject.UserClass类型没有被序列化,因此这个对象不能存储到状态视图里。
给CodeProject.UserClass加一个序列化的特性,这段代码就可以正常运行。
…………………………..
…………………………..
[Serializable()]
public class UserClass
... {
public UserClass()
...{
_number=1;
_name="cp.com";
}
private int _number;
private string _name;
}
…………………………..
…………………………..
…………………………..
原文:http://www.codeproject.com/aspnet/ms_viewstate.asp