ASP.NET基础 专题
您的位置:csharp > ASP.NET基础专题 > ASP.NET管理状态
ASP.NET管理状态
作者:--    发布时间:2019-11-20

超文本传输协议(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字典对象中的字符串,但是它可以存储所有由基本数据类型组成的基本数据类型和数组,以及datasetdatatablehashtableimage对象, 定义的类从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>
            &nbsp; &nbsp; &nbsp;

            <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.";
}

网站声明:
本站部分内容来自网络,如您发现本站内容
侵害到您的利益,请联系本站管理员处理。
联系站长
373515719@qq.com
关于本站:
编程参考手册