- ASP.NET 教程
- ASP.NET - 首页
- ASP.NET - 简介
- ASP.NET - 环境
- ASP.NET - 生命周期
- ASP.NET - 第一个示例
- ASP.NET - 事件处理
- ASP.NET - 服务器端
- ASP.NET - 服务器控件
- ASP.NET - HTML服务器控件
- ASP.NET - 客户端
- ASP.NET - 基本控件
- ASP.NET - 指令
- ASP.NET - 状态管理
- ASP.NET - 验证器
- ASP.NET - 数据库访问
- ASP.NET - ADO.NET
- ASP.NET - 文件上传
- ASP.NET - 广告轮播
- ASP.NET - 日历控件
- ASP.NET - 多视图
- ASP.NET - 面板控件
- ASP.NET - AJAX 控件
- ASP.NET - 数据源
- ASP.NET - 数据绑定
- ASP.NET - 自定义控件
- ASP.NET - 个性化设置
- ASP.NET - 错误处理
- ASP.NET - 调试
- ASP.NET - LINQ
- ASP.NET - 安全性
- ASP.NET - 数据缓存
- ASP.NET - Web 服务
- ASP.NET - 多线程
- ASP.NET - 配置
- ASP.NET - 部署
- ASP.NET 资源
- ASP.NET - 快速指南
- ASP.NET - 有用资源
- ASP.NET - 讨论
ASP.NET - 状态管理
超文本传输协议 (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 类具有以下属性:
属性 | 描述 |
---|---|
Item(name) | 具有指定名称的视图状态项的值。这是 StateBag 类的默认属性。 |
Count | 视图状态集合中的项目数。 |
Keys | 集合中所有项目的键的集合。 |
Values | 集合中所有项目的值的集合。 |
StateBag 类具有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 向视图状态集合添加项,并更新现有项。 |
Clear | 删除集合中的所有项。 |
Equals(Object) | 确定指定的对象是否等于当前对象。 |
Finalize | 允许它释放资源并执行其他清理操作。 |
GetEnumerator | 返回一个枚举器,该枚举器迭代存储在 StateBag 对象中的所有 StateItem 对象的键/值对。 |
GetType | 获取当前实例的类型。 |
IsItemDirty | 检查存储在 StateBag 对象中的 StateItem 对象以评估它是否已修改。 |
Remove(name) | 删除指定的项。 |
SetDirty | 设置 StateBag 对象的状态以及它包含的每个 StateItem 对象的 Dirty 属性。 |
SetItemDirty | 设置 StateBag 对象中指定的 StateItem 对象的 Dirty 属性。 |
ToString | 返回表示状态包对象的字符串。 |
示例
以下示例演示了存储视图状态的概念。让我们保留一个计数器,每次单击页面上的按钮回发页面时,计数器都会递增。标签控件显示计数器中的值。
标记文件代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="statedemo._Default" %> <!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> Untitled Page </title> </head> <body> <form id="form1" runat="server"> <div> <h3>View State demo</h3> Page Counter: <asp:Label ID="lblCounter" runat="server" /> <asp:Button ID="btnIncrement" runat="server" Text="Add Count" onclick="btnIncrement_Click" /> </div> </form> </body> </html>
示例的代码隐藏文件如下所示:
public partial class _Default : 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) { lblCounter.Text = counter.ToString(); counter++; } }
它将产生以下结果:
控件状态
控件状态不能修改、直接访问或禁用。
会话状态
当用户连接到 ASP.NET 网站时,会创建一个新的会话对象。启用会话状态后,将为每个新请求创建一个新的会话状态对象。此会话状态对象成为上下文的一部分,并且可以通过页面访问。
会话状态通常用于存储应用程序数据,例如库存、供应商列表、客户记录或购物车。它还可以保留有关用户及其偏好的信息,并跟踪未完成的操作。
会话通过 120 位 SessionID 进行标识和跟踪,该 ID 以 cookie 或修改后的 URL 的形式在客户端和服务器之间传递。SessionID 是全局唯一的且随机的。
会话状态对象由 HttpSessionState 类创建,该类定义会话状态项的集合。
HttpSessionState 类具有以下属性:
属性 | 描述 |
---|---|
SessionID | 唯一的会话标识符。 |
Item(name) | 具有指定名称的会话状态项的值。这是 HttpSessionState 类的默认属性。 |
Count | 会话状态集合中的项目数。 |
TimeOut | 获取和设置请求之间允许的时间量(以分钟为单位),在此时间之后,会话状态提供程序将终止会话。 |
HttpSessionState 类具有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 向会话状态集合添加项。 |
Clear | 删除会话状态集合中的所有项。 |
Remove(name) | 从会话状态集合中删除指定的项。 |
RemoveAll | 删除会话状态集合中的所有键和值。 |
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 对象继承的用户定义类。
示例
以下示例演示了存储会话状态的概念。页面上有两个按钮,一个文本框用于输入字符串,一个标签用于显示从上次会话存储的文本。
标记文件代码如下:
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <!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> Untitled Page </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="Enter a String" 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="No action button" style="width:128px" /> </td> <td style="width: 317px"> <asp:Button ID="btnstr" runat="server" OnClick="btnstr_Click" Text="Submit the String" /> </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>
在设计视图中应如下所示:
代码隐藏文件在此处给出:
public partial class _Default : 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"]; } }
执行文件并观察其工作方式。
应用程序状态
ASP.NET 应用程序是 Web 服务器上单个虚拟目录中所有网页、代码和其他文件的集合。当信息存储在应用程序状态中时,所有用户都可以访问它。
为了提供应用程序状态的使用,ASP.NET 为每个应用程序从 HTTPApplicationState 类创建一个应用程序状态对象,并将此对象存储在服务器内存中。此对象由类文件 global.asax 表示。
应用程序状态主要用于存储点击计数器和其他统计数据、全局应用程序数据(如税率、折扣率等)以及跟踪访问网站的用户。
HttpApplicationState 类具有以下属性:
属性 | 描述 |
---|---|
Item(name) | 具有指定名称的应用程序状态项的值。这是 HttpApplicationState 类的默认属性。 |
Count | 应用程序状态集合中的项目数。 |
HttpApplicationState 类具有以下方法:
方法 | 描述 |
---|---|
Add(name, value) | 向应用程序状态集合添加项。 |
Clear | 删除应用程序状态集合中的所有项。 |
Remove(name) | 从应用程序状态集合中删除指定的项。 |
RemoveAll | 从 HttpApplicationState 集合中删除所有对象。 |
RemoveAt | 通过索引从集合中删除 HttpApplicationState 对象。 |
Lock() | 锁定应用程序状态集合,以便只有当前用户可以访问它。 |
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."; }