超文本传输协议(HTTP)是一种无状态协议。 当客户端从服务器断开连接时,ASP.NET引擎将丢弃页面对象。 这样,每个Web应用程序都可以扩展以同时提供大量请求,而不会耗尽服务器内存。
但是,需要一些技术来在请求之间存储信息并在需要时检索相关信息。即当前会话中当前用户的所有控制和变量的当前值被称为状态。
ASP.NET管理四种类型的状态:
- 视图状态
- 控件状态
- 会话状态
- 应用状态
视图状态
视图状态是页面及其所有控件的状态。 它由ASP.NET框架在发送之间自动维护。
当页面被发送回客户端时,页面及其控件属性的改变被确定,并存储在名为_VIEWSTATE
的隐藏输入字段的值中。当页面再次被回发时,_VIEWSTATE
字段被发送到具有HTTP请求的服务器。
视图状态可以被启用或禁用:
- 整个应用程序通过在
Web.config
文件的<pages>
部分中设置EnableViewState
属性。 - 通过将
Page
指令的EnableViewState
属性设置为<%@ Page Language="C#" EnableViewState="false" %>
- 通过设置控件的
Control.EnableViewState
属性。
它使用由StateBag
类定义的视图状态对象来实现,该类定义视图状态项的集合。状态包是一个包含属性值对的数据结构,存储为与对象关联的字符串。
StateBag
类具有以下属性:
编号 | 属性 | 描述 |
---|---|---|
1 | Item(name) |
具有指定名称的视图状态项目的值。这是StateBag 类的默认属性。 |
2 | Count |
视图状态集合中的项目数量。 |
3 | Keys |
集合中所有项目的键集合。 |
4 | Values |
集合中所有项目的值的集合。 |
StateBag
类具有以下方法:
编号 | 方法 | 描述 |
---|---|---|
1 | Add(name, value) |
将项目添加到视图状态集合,并更新现有项目。 |
2 | Clear |
删除集合中的所有项目。 |
3 | Equals(Object) |
确定指定的对象(Object )是否等于当前对象。 |
4 | Finalize |
允许它释放资源并执行其他清理操作。 |
5 | GetEnumerator |
返回一个枚举器,该枚举器遍历存储在StateBag 对象中的StateItem 对象的所有键/值对。 |
6 | GetType |
获取当前实例的类型。 |
7 | IsItemDirty |
检查存储在StateBag 对象中的StateItem 对象,以确定它是否已被修改。 |
8 | Remove(name) |
删除指定的项目。 |
9 | SetDirty |
设置StateBag 对象的状态以及它包含的每个StateItem 对象的Dirty 属性。 |
10 | SetItemDirty |
设置StateBag 对象中指定的StateItem 对象的Dirty 属性。 |
11 | ToString |
返回表示状态包对象的字符串。 |
示例
以下示例演示了存储视图状态的概念。使用一个计数器,通过单击页面上的按钮,每次页面被重新发送时,计数器都会增加。 另一个标签控件显示计数器中的值。
首先启动Visual Studio,创建一个名称为:ManagingState 的空网站项目,如下所示 -
添加一个新的窗体页面 - ViewState.aspx,如下所示 -
ViewState.aspx 的代码实现如下 -
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="ViewState.aspx.cs" Inherits="ViewState" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>视图状态</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<h3>视图状态示例</h3>
页面计数器:
<asp:Label ID="lblCounter" runat="server" />
<asp:Button ID="btnIncrement" runat="server" Text="添加计数" onclick="btnIncrement_Click" />
</div>
</form>
</body>
</html>
后端实现的Default.aspx.cs 如下 -
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class ViewState : System.Web.UI.Page
{
public int counter
{
get
{
if (ViewState["pcounter"] != null)
{
return ((int)ViewState["pcounter"]);
}
else
{
return 0;
}
}
set
{
ViewState["pcounter"] = value;
}
}
protected void Page_Load(object sender, EventArgs e)
{
counter = counter + 1;
lblCounter.Text = counter.ToString();
}
protected void btnIncrement_Click(object sender, EventArgs e)
{
//counter = counter + 1;
lblCounter.Text = counter.ToString();
}
}
运行后,得到以下结果 -
控件状态
控件状态不能修改,直接访问或禁用。
会话状态
当用户连接到ASP.NET网站时,会创建一个新的会话对象。 当会话状态打开时,会为每个新请求创建一个新的会话状态对象。 此会话状态对象成为上下文的一部分,并通过该页面可用。
会话状态通常用于存储应用程序数据,如库存,供应商列表,客户记录或购物车。 它还可以保存关于用户和他的偏好的信息,并保持未决操作的轨迹。
会话使用120
位长度的SessionID
进行标识和跟踪,SessionID
从客户端传递到服务器,并作为cookie
或修改后的URL返回。 SessionID
是全局唯一和随机的。
会话状态对象是从HttpSessionState
类创建的,该类定义了会话状态项的集合。
HttpSessionState
类具有以下属性:
编号 | 属性 | 描述 |
---|---|---|
1 | SessionID |
唯一的会话标识符。 |
2 | Item(name) |
具有指定名称的会话状态项的值。这是HttpSessionState 类的默认属性。 |
3 | Count |
会话状态集合中的项目数量。 |
4 | TimeOut |
获取并设置会话状态提供程序终止会话之前请求之间允许的时间量(以分钟为单位)。 |
HttpSessionState
类具有以下方法:
编号 | 方法 | 描述 |
---|---|---|
1 | Add(name, value) |
将项目添加到会话状态集合。 |
2 | Clear |
从会话状态集合中删除所有项目。 |
3 | Remove(name) |
从会话状态集合中删除指定的项目。 |
4 | RemoveAll |
从会话状态集合中删除所有的键和值。 |
5 | RemoveAt |
从会话状态集合中删除指定索引处的项目。 |
会话状态对象是一个名称-值对,用于存储和检索会话状态对象的一些信息。可以使用下面的代码来做同样的事情:
void StoreSessionInfo()
{
String fromuser = TextBox1.Text;
Session["fromuser"] = fromuser;
}
void RetrieveSessionInfo()
{
String fromuser = Session["fromuser"];
Label1.Text = fromuser;
}
上面的代码只存储Session字典对象中的字符串,但是它可以存储所有由基本数据类型组成的基本数据类型和数组,以及DataSet
,DataTable
,HashTable
和Image
对象, 定义的类从ISerializable
对象继承。
示例
以下示例演示了存储会话状态的概念。 在页面上有两个按钮,一个输入字符串的文本框和一个标签来显示上次会话存储的文本。
在项目:ManagingState 上创建一个新的窗体文件:SessionState.aspx ,如下所示 -
参考以下代码(SessionState.aspx) -
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="SessionState.aspx.cs" Inherits="SessionState" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title>Session状态</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<table style="width: 568px; height: 103px">
<tr>
<td style="width: 209px">
<asp:Label ID="lblstr" runat="server" Text="输入一个字符串:" style="width:94px">
</asp:Label>
</td>
<td style="width: 317px">
<asp:TextBox ID="txtstr" runat="server" style="width:227px">
</asp:TextBox>
</td>
</tr>
<tr>
<td style="width: 209px"> </td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Button ID="btnnrm" runat="server"
Text="无动作按钮" style="width:128px" />
</td>
<td style="width: 317px">
<asp:Button ID="btnstr" runat="server"
OnClick="btnstr_Click" Text="提交" />
</td>
</tr>
<tr>
<td style="width: 209px"> </td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Label ID="lblsession" runat="server" style="width:231px" >
</asp:Label>
</td>
<td style="width: 317px"> </td>
</tr>
<tr>
<td style="width: 209px">
<asp:Label ID="lblshstr" runat="server">
</asp:Label>
</td>
<td style="width: 317px"> </td>
</tr>
</table>
</div>
</form>
</body>
</html>
在设计视图中应该如下所示:
文件后端处理的代码(SessionState.aspx.cs
)如下所示:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class SessionState : System.Web.UI.Page
{
String mystr;
protected void Page_Load(object sender, EventArgs e)
{
this.lblshstr.Text = this.mystr;
this.lblsession.Text = (String)this.Session["str"];
}
protected void btnstr_Click(object sender, EventArgs e)
{
this.mystr = this.txtstr.Text;
this.Session["str"] = this.txtstr.Text;
this.lblshstr.Text = this.mystr;
this.lblsession.Text = (String)this.Session["str"];
}
}
执行该文件并观察其结果和工作原理:
Application状态
ASP.NET应用程序是Web服务器上单个虚拟目录中的所有网页,代码和其他文件的集合。 信息以应用程序状态存储时,所有用户都可以使用。
为了提供应用程序状态的使用,ASP.NET从HTTPApplicationState
类为每个应用程序创建一个应用程序状态对象,并将此对象存储在服务器内存中。该对象由类文件global.asax
表示。
应用程序状态主要用于存储点击计数器和其他统计数据,全局应用程序数据(如税率,折扣率等),并保持用户访问该网站的轨迹。
HttpApplicationState
类具有以下属性:
编号 | 属性 | 描述 |
---|---|---|
1 | Item(name) |
具有指定名称的应用程序状态项的值。 这是HttpApplicationState 类的默认属性。 |
2 | Count |
应用程序状态集合中的项目数。 |
HttpApplicationState
类具有以下方法:
编号 | 方法 | 描述 |
---|---|---|
1 | Add(name, value) |
将项目添加到应用程序状态集合。 |
2 | Clear |
从应用程序状态集合中删除所有项目。 |
3 | Remove(name) |
从应用程序状态集合中删除指定的项目。 |
4 | RemoveAll |
从HttpApplicationState 集合中删除所有对象。 |
5 | RemoveAt |
通过索引从集合中删除HttpApplicationState 对象。 |
6 | Lock() |
锁定应用程序状态集合,以便只有当前用户可以访问它。 |
7 | Unlock() |
解锁应用程序状态收集,以便所有用户都可以访问它。 |
应用程序状态数据通常通过为事件编写处理程序来维护:
- Application_Start
- Application_End
- Application_Error
- Session_Start
- Session_End
以下代码片段显示了存储应用程序状态信息的基本语法:
Void Application_Start(object sender, EventArgs e)
{
Application["startMessage"] = "The application has started.";
}
Void Application_End(object sender, EventArgs e)
{
Application["endtMessage"] = "The application has ended.";
}