我们知道了ASP.NET中有四种状态,状态用于储存当前会话中当前用户的所有控件和变量的当前值的。网络本身是没有状态的,每次页面提交到服务器后,接着返回浏览器,该页面会重新创建一次。.比较一下会话状态和视图状态:
会话状态[Session State]
会话状态[Session State]:当链接到一个网站时,便创建了一个会话。ASP.NET的会话状态的特性有:
*在禁用Cookies的浏览器中工作运行;
*对已经存在的会话请求进行识别;
*存储会话范围内的数据在多请求中使用;
*在global.asax中配置Session_Start或者Session_End事件用于不同的处理;
*会话结束或超时,自动释放会话资源。
默认情况下,会话状态作为ASP.NET的部分进程存于服务器内存中。通过配置,也可以使它存储在进程以外,如单独的状态服务器、SQL SERVER数据库,这样,在ASP.NET进程崩溃或者重启时,会话依然可以继续进行。
看一个示例:
前台文件:Default.aspx
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default_aspx" EnableSessionState="True"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
- <html xmlns="http://www.w3.org/1999/xhtml" >
- <head runat="server">
- <title>Session State</title>
- </head>
- <body>
- <form id="form1" runat="server">
- <div>
- <h1>Session State</h1>
- <h3>Select a book category</h3>
- <asp:RadioButtonList ID="rbl" runat="server" CellSpacing="20" RepeatColumns="3" RepeatDirection="Horizontal" OnSelectedIndexChanged="rbl_SelectedIndexChanged">
- <asp:ListItem Value="n">.NET</asp:ListItem>
- <asp:ListItem Value="d">Databases</asp:ListItem>
- <asp:ListItem Value="h">Hardware</asp:ListItem>
- </asp:RadioButtonList>
- <asp:Button ID="btn" runat="server" Text="Submit" OnClick="btn_Click" />
- <br />
- <br />
- <asp:Label ID="lblMessage" runat="server"></asp:Label>
- <br />
- <br />
- <asp:DropDownList ID="ddl" runat="server" Visible="False">
- </asp:DropDownList></div>
- </form>
- </body>
- </html>
后台文件:Default.aspx.cs
- using System;
- using System.Data;
- using System.Configuration;
- using System.Web;
- using System.Web.Security;
- using System.Web.UI;
- using System.Web.UI.WebControls;
- using System.Web.UI.WebControls.WebParts;
- using System.Web.UI.HtmlControls;
- using System.Text; // 使用StringBuilder必须调用该命名空间
- public partial class Default_aspx : System.Web.UI.Page
- {
- protected void Page_Load(object sender, EventArgs e)
- {
- }
- protected void rbl_SelectedIndexChanged(object sender, EventArgs e)
- {
- if (rbl.SelectedIndex != -1)//只要单击了单选按钮,该事件将创建一个数组用来存储列表信息,然后将被选项的Text和Value属性赋值。
- {
- string[] Books = new string[3];
- Session["cattext"] = rbl.SelectedItem.Text;
- Session["catcode"] = rbl.SelectedItem.Value;
- switch (rbl.SelectedItem.Value)//switch语句
- {
- case "n":
- Books[0] = "Programming C#";
- Books[1] = "Programming ASP.NET";
- Books[2] = "C# Essentials";
- break;
- case "d":
- Books[0] = "Oracle & Open Source";
- Books[1] = "SQL in a Nutshell";
- Books[2] = "Transact-SQL Programming";
- break;
- case "h":
- Books[0] = "PC Hardware in a Nutshell";
- Books[1] = "Dictionary of PC Hardware and Data Communications Terms";
- Books[2] = "Linux Device Drivers";
- break;
- }
- Session["books"] = Books;
- }
- }
- protected void btn_Click(object sender, EventArgs e)
- {
- if (rbl.SelectedIndex == -1)
- {
- lblMessage.Text = "You must select a book category.";
- }
- else
- {
- StringBuilder sb = new StringBuilder();//StringBuilder的用法,Append的用法
- sb.Append("You have selected the category ");
- sb.Append((string)Session["cattext"]);
- sb.Append(" with code /"");
- sb.Append((string)Session["catcode"]);
- sb.Append("/".");
- lblMessage.Text = sb.ToString();
- ddl.Visible = true;
- string[] CatBooks = (string[])Session["books"];
- // Populate the DropDownList.
- int i;
- ddl.Items.Clear();
- for (i = 0; i < CatBooks.GetLength(0); i++)
- {
- ddl.Items.Add(new ListItem(CatBooks[i]));
- }
- }
- }
- }
页面会话状态配置由page指令控制,默认情况下,系统是开启了的。可以通过
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default_aspx" EnableSessionState="True"%>
- <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="Default_aspx" EnableSessionState="False"%>
- <%@ 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控件而言,视图状态的存在没有任何意义,可以通过
- gv.EnableViewState = false ;
来单独禁用。
视图状态不适用于:
*大量数据需要储存
*数据需要保证安全性
*视图状态只能对字符串、整数、布尔值、数组、哈希表进行优化,其他数据类型会导致性能下降。
视图状态不消耗服务器资源,也不会超时,这与会话状态相反。
本文翻译自Programming ASP.NET