web应用程序创建于HTTP协议的顶层,这个协议是一个无状态的协议.
页面和它的子控件是基于每一个请求而创建的,请求最后阶段被删除.
然而在一个Web请求的持续时间外,保持信息,常常是需要的.
这个机制在传统的ASP状态管理编程是可用的,比如session,cookies.
然而session不可扩展,cookies不能被所有的应用程序所依赖.
asp.net提供了一个新机制---视图状态(view state)
这种机制可以使页面和它的子控件在,从服务器到客户端,再从客户端返回的,往返过程中,保持状态信息.
视图状态提供了一种简单而方便的技术,可以在一个固有的,无状态环境之上,创建一个,有状态的,并持续执行的页面的效果.
本质上,默认的视图状态机制包括了通过页面上一个隐含的变量,来保持状态信息.
使用视图状态机制的最简单的方法就是通过控件,从Control类继承来的Viewstate属性.
ViewState属性,输入System.Web.UI.StateBag类型---一个键/值对的字典,控件属性的值可以储存到这里.
控件ViewStateDemoLabel定义了两个属性text和textinviewstate.
text存到私有域中,
把TextInViewState存储到ViewState字典中.
using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace MSPress.ServerControls
{
public class ViewStateDemoLabel:WebControl
{
private string _text;
public string Text {
get { return(_text==null)?String.Empty:_text;}
set { _text=value;}
}
public string TextInViewState
{
get
{
object o=ViewState["TextInViewState"];
return (o==null)?String.Empty:(string)o;
}
set
{
ViewState["TextInViewState"] = value;
}
}
protected override void RenderContents(HtmlTextWriter writer)
{
writer.Write("Text=");
writer.Write(Text);
writer.Write("<br>");
writer.Write("TextInViewState=");
writer.Write(TextInViewState);
}
}
}
当页面框架在回传之后重载家在控件时,会自动重新存储一些属性,
这些属性在上一次请求的处理过程的最后,将他们的状态值,存储到ViewState中.
当属性被存储到ViewState字典中时,
ViewState会在控件初始化后,跟踪属性.
只有当属性初始化后,被修改时,ViewState才会在控件的可串行化视图状态中,
保存属性的值.
这个过程最小化了往返过程中数据的大小.
使用ViewState作为属性存储,自定义控件,可以容易地进行基本的状态管理,
而不用事先自定义的状态管理逻辑程序.
如果属性没有出现在ViewState字典中,那么属性获取操作(Getter)必须返回与属性相关的默认值.
用于在ViewState中,存储属性的键,通常是代表属性名的字符串.
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="WebApplication1._Default" %>
<%@ Register Assembly="MSPress.ServerControls" Namespace="MSPress.ServerControls"
TagPrefix="msp" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title></title>
<script runat="server">
void button1_Click(object sender, EventArgs e)
{
demolable1.Text = textbox1.Text;
demolable1.TextInViewState = textbox2.Text;
}
</script>
</head>
<body>
<form id="form1" runat="server">
<div>
First Name: <asp:TextBox ID="textbox1" runat="server"></asp:TextBox><br />
Last Name: <asp:TextBox ID="textbox2" runat="server"></asp:TextBox>
</div>
<div>
<asp:Button ID="button1" runat="server" Text="Submit" OnClick="button1_Click" />
<asp:Button ID="button2" runat="server" Text="ReLoad"/>
</div>
<div>
<msp:ViewStateDemoLabel ID="demolable1" runat="server" Font-Size="Medium" Font-Names="Verdana" />
</div>
</form>
</body>
</html>
HTML源代码,有一个隐含的input控件,名为"_VIEWSTATE".64基数编码字符串,这个字符串包含了页面和所有控件的串行化的视图状态.
了解页面和每一个控件的视图状态大小:
<%@PageLanguage=”C#” Trace=”true”%>
可在视图状态中存储多种类型:
视图状态串行化机制默认支持:
Int32,Boolean,String,Unit,Color.
为Arrary,ArraryList和包含上面列出类型的Hashtable对象而优化.
使用Session和Application对象
有时,控件可能需要跨用户对话,甚至跨应用程序复用数据.
Asp.net提供的内部Session和Application对象的一些总体的准则:
1。用视图状态,存储控件需要在回传后,恢复状态数据.
2。使用System.Web.SessionState.HttpSessionState对象,这个对象可在控件上,
作为Page.Session使用,可以存储需要跨用户浏览器会话的数据.
可以在Page.Session中存储敏感的信息,因为这个信息只存在于服务器上.
Session对象为每一个用户会话而创建;当使用Session对象时,没有必要为线程的安全担心.
然而,应注意允许页面开发者对特定的Web应用程序关闭Sesson状态特性.
3。使用System.Web.HttpApplicationState对象,这个对象可在控件上作为
Page.Application使用,可以存储需要整个应用程序的数据.这个对象只存在于服务器上.
Page.Application对象不是线程安全的,因为多个用户可以同时访问页面.
当使用Page.Application对象时,应该为线程的安全性负责.