ASP.NET中的状态

我们知道了ASP.NET中有四种状态,状态用于储存当前会话中当前用户的所有控件和变量的当前值的。网络本身是没有状态的,每次页面提交到服务器后,接着返回浏览器,该页面会重新创建一次。.比较一下会话状态和视图状态:

会话状态[Session State]

会话状态[Session State]:当链接到一个网站时,便创建了一个会话。ASP.NET的会话状态的特性有:

    *在禁用Cookies的浏览器中工作运行;

    *对已经存在的会话请求进行识别;

    *存储会话范围内的数据在多请求中使用;

    *在global.asax中配置Session_Start或者Session_End事件用于不同的处理;

    *会话结束或超时,自动释放会话资源。

默认情况下,会话状态作为ASP.NET的部分进程存于服务器内存中。通过配置,也可以使它存储在进程以外,如单独的状态服务器、SQL SERVER数据库,这样,在ASP.NET进程崩溃或者重启时,会话依然可以继续进行。

看一个示例:

前台文件:Default.aspx

  1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="Default_aspx"  EnableSessionState="True"%>
  2. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
  3. <html xmlns="http://www.w3.org/1999/xhtml" >
  4. <head runat="server">
  5.     <title>Session State</title>
  6. </head>
  7. <body>
  8.     <form id="form1" runat="server">
  9.     <div>
  10.         <h1>Session State</h1>
  11.         <h3>Select a book category</h3>
  12.          <asp:RadioButtonList ID="rbl" runat="server" CellSpacing="20" RepeatColumns="3" RepeatDirection="Horizontal" OnSelectedIndexChanged="rbl_SelectedIndexChanged">
  13.              <asp:ListItem Value="n">.NET</asp:ListItem>
  14.              <asp:ListItem Value="d">Databases</asp:ListItem>
  15.              <asp:ListItem Value="h">Hardware</asp:ListItem>
  16.          </asp:RadioButtonList>
  17.          <asp:Button ID="btn" runat="server" Text="Submit" OnClick="btn_Click" />
  18.          <br />
  19.          <br />
  20.          <asp:Label ID="lblMessage" runat="server"></asp:Label>
  21.          <br />
  22.          <br />
  23.          <asp:DropDownList ID="ddl" runat="server" Visible="False">
  24.          </asp:DropDownList></div>
  25.     </form>
  26. </body>
  27. </html>

后台文件:Default.aspx.cs

 

  1. using System;
  2. using System.Data;
  3. using System.Configuration;
  4. using System.Web;
  5. using System.Web.Security;
  6. using System.Web.UI;
  7. using System.Web.UI.WebControls;
  8. using System.Web.UI.WebControls.WebParts;
  9. using System.Web.UI.HtmlControls;
  10. using System.Text;   //  使用StringBuilder必须调用该命名空间
  11. public partial class Default_aspx : System.Web.UI.Page 
  12. {
  13.     protected void Page_Load(object sender, EventArgs e)
  14.     {
  15.     }
  16.   
  17.  protected void rbl_SelectedIndexChanged(object sender, EventArgs e)
  18.   {
  19.    if (rbl.SelectedIndex != -1)//只要单击了单选按钮,该事件将创建一个数组用来存储列表信息,然后将被选项的Text和Value属性赋值。
  20.    {
  21.     string[] Books = new string[3];
  22.     Session["cattext"] = rbl.SelectedItem.Text;
  23.     Session["catcode"] = rbl.SelectedItem.Value;
  24.     switch (rbl.SelectedItem.Value)//switch语句
  25.     {
  26.      case "n":
  27.       Books[0] = "Programming C#";
  28.       Books[1] = "Programming ASP.NET";
  29.       Books[2] = "C# Essentials";
  30.       break;
  31.      case "d":
  32.       Books[0] = "Oracle & Open Source";
  33.       Books[1] = "SQL in a Nutshell";
  34.       Books[2] = "Transact-SQL Programming";
  35.       break;
  36.      case "h":
  37.       Books[0] = "PC Hardware in a Nutshell";
  38.       Books[1] = "Dictionary of PC Hardware and Data Communications Terms";
  39.       Books[2] = "Linux Device Drivers";
  40.       break;
  41.     }
  42.     Session["books"] = Books;
  43.    }
  44.   }
  45.  protected void btn_Click(object sender, EventArgs e)
  46.   {
  47.    if (rbl.SelectedIndex == -1)
  48.    {
  49.     lblMessage.Text = "You must select a book category.";
  50.    }
  51.    else
  52.    {
  53.     StringBuilder sb = new StringBuilder();//StringBuilder的用法,Append的用法
  54.     sb.Append("You have selected the category ");
  55.     sb.Append((string)Session["cattext"]);
  56.     sb.Append(" with code /"");
  57.     sb.Append((string)Session["catcode"]);
  58.     sb.Append("/".");
  59.     lblMessage.Text = sb.ToString();
  60.     ddl.Visible = true;
  61.     string[] CatBooks = (string[])Session["books"];
  62.     //  Populate the DropDownList.
  63.     int i;
  64.     ddl.Items.Clear();
  65.     for (i = 0; i < CatBooks.GetLength(0); i++)
  66.     {
  67.      ddl.Items.Add(new ListItem(CatBooks[i]));
  68.     }
  69.    }
  70.   }
  71.  }

页面会话状态配置由page指令控制,默认情况下,系统是开启了的。可以通过

 

  1. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="Default_aspx"  EnableSessionState="True"%>
  2. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="Default_aspx"  EnableSessionState="False"%>
  3. <%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="Default_aspx"  EnableSessionState="ReadOnly"%>

来设置其开启、关闭、只读。如果页面不需要会话状态,可以使用后两者获得服务器性能的小幅提升。

通过设置web.config文件中的sessionState的mode属性,可以是会话状态独立储存。

视图状态[View State]

视图状态:页面及控件的状态。例如,在提交按钮按下后,页面还需要保留一些信息,就是视图状态的功用。

视图状态可以同会话状态一样在page指令中使用EnableViewState="false"来使其失效,还可以将表单的<form runat="server">省略掉,还可以通过web.config文件中page节的enableViewState的false来实现同样的效果。

值得一提的是,控件有EnableViewState属性,这就是说,控件可以单独的通过该属性进行开启或禁用。例如,对于每次都需要加载数据库的GridView控件而言,视图状态的存在没有任何意义,可以通过

 

  1. gv.EnableViewState = false ;

来单独禁用。

视图状态不适用于:

    *大量数据需要储存

    *数据需要保证安全性

    *视图状态只能对字符串、整数、布尔值、数组、哈希表进行优化,其他数据类型会导致性能下降。

视图状态不消耗服务器资源,也不会超时,这与会话状态相反。

 

 

本文翻译自Programming ASP.NET

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值