ASP.NET的状态管理
 状态时某一类型的数据在一定时期内保持活跃的信息。这里说的一定时期可以使整个应用程序的生命周期,可以使用户操作程序的时间,当然也可以是单个页面的生命周期等。
 为了解决传统Web编程中固有的限制,ASP.NET提供了按页面保留数据和在整个应用程序范围内保留数据的功能,这些具体功能如下:
(其中1到5是以不同方式将数据存储到客户端上,6到8是将数据存储到服务器上的内存中)
一、视图状态
ViewState属性提供一个字典对象,用于在对同一页的多个请求之间保留值。它是页用来在往返行程之间保留页和控件属性值的默认方法。
当将页面回发至服务器时,页面会在页的初始化阶段分析视图状态字符串,和原页中的属性信息。也可以使用视图状态来存储值。
视图状态提供了特定ASP.NET页的状态信息。如果需要在多个页上使用信息,或者如果需要在访问网站时保留信息,则应当使用另一个方法(如应用程序状态、会话状态或个性化设置)来维护状态。
注意:视图状态信息将序列化为XML,然后使用Base64编码进行编码,这将生成大量的数据。将页回发到服务器时,视图状态的内容将作为页面回发信息的一部分发送。如果视图状态包含大量信息,则会影响页的性能。
在某些情况下(如数据驱动页在每次回发时从数据存储区进行刷新),应当关闭视图状态以移除由数据控件(如GridView控件)生成的大量隐藏字段。
 换句话说,我们要尽量避免在前台使用视图状态,如果可能的话,可以用input的控件,这样可以提高网站的性能。
 存储在视图状态中的数据类型 如下:字符串、整数、布尔值、Array对象、Arraylist对象、哈希表、自定义类型转换器。
 使用视图状态具有以下3个优点:
一、耗费的服务器资源较少(与Application、Session相比):因为,视图状态数据都写入了客户端计算机中 。
二、易于维护:在默认情况下.NET系统自动启用对控件状态数据的维护。
三、增强的安全功能:视图状态中的值经过哈希计算和压缩,并且针对Unicode实现进行编码,其安全性要高于使用隐藏域。
 使用视图状态具有以下3个缺点:
一、性能注意事项:如果存储较大的值,用户显示页和发送页时的速度减慢。
二、设备限制:移动设备可能没有足够的内存容量来存储大量的视图状态数据。
三、潜在的安全风险:视图状态存储在页上的一个或多个隐藏域中。虽然视图状态以哈希表格式存储数据,但它可以被篡改。
 
 加密视图状态:在@ Page指令中,将ViewStateEncryptionMode属性设置为“Always”
<% @Page ViewStateEncryptionMode="Always" ...  %>

二、控件状态
三、隐藏域
ASP.NET允许将信息存储在HiddenField控件中,此控件将呈现为一个标准的HTML隐藏域。隐藏域在浏览器中以不可见的形式呈现,但可以像对待标准控件一样设置其属性。
当向服务器提交页面时,隐藏域的内容将在HTTP窗体集合中随同其它控件的值一起发送。隐藏域可用作一个储存库,可以将存储到页中的任何特定于页的信息放置其中。

四、客户端Cookie
Cookie可以保存少量的数据,这些数据或者存储在客户端文件系统的文本本件中或者存储在客户端浏览器会话的内存中。
当浏览器请求某页面时,客户端会将Cookie中的信息连同请求信息一起发送。服务器可以读取Cookie并提取它的值。
用法如下:
第一种存储:
            //HttpCookie hc = new HttpCookie("user");// 创建Cookie对象
            //hc["Name"]=TextBox1.Text;
            //hc["Pwd"] = TextBox2.Text;
            //hc.Expires=DateTime.Now.AddDays(1);//设置Cookie的过期时间(在现在的时间上加,如果删除,则加一个负数)
            //Response.Cookies.Add(hc);
第二种存储:
            //直接指定Cookie对象
            //Response.Cookies["user"]["Name"] = TextBox1.Text;
            //Response.Cookies["user"]["Pwd"] = TextBox2.Text;
            //Response.Cookies["user"].Expires = DateTime.Now.AddDays(1);
(注:存储时,都用的是Response)
接收时:用Request接收
        //if(Request.Cookies["user"]!=null)
        //{
        //    Response.Write("用户名:"+Request.Cookies["user"]["Name"]+"
");
        //    Response.Write("密码:"+Request.Cookies["user"]["Pwd"]);
        //}

五、查询字符串
查询字符串是在页面URL的结尾附加的信息。
查询字符串提供了一种维护状态信息的方法,这种方法很简单,但是有使用上的限制。利用查询字符串功能可以很容易地将信息从一个页面传送到另一个页面。
用法如下:
传递时:在URL后加?
        if (Request.Form["TextBox1"] != "")
        {
            Response.Redirect("Main.aspx?username="+Request.Form["TextBox1"]);
        }
接收时:用Request
<%= Request["username"]%>

以下是基于服务器的状态管理:
六、应用程序状态
ASP.NET允许使用应用程序状态来保存每个活动的Web应用程序的值,应用程序状态是HttpApplicationState类的一个实例。
应用程序状态存储在一个键/值字典中,在每次请求一个特定的URL期间都会创建这样一个字典。可以将特定于应用程序的信息添加到此结构以在页请求期间存储它。一旦将应用程序特定的信息添加到应用程序的状态中,服务器就会管理该对象。

七、会话状态(Session)
ASP.NET允许使用会话状态保存每个活动的Web应用程序的会话值,会话状态是HttpSessionState类的一个实例。
会话状态与应用程序状态相似,不同的是会话状态的范围限于当前的浏览器会话。如果有不同的用户在使用应用程序,则每个用户会话都将有一个不同的会话状态。

八、配置文件属性
ASP.NET提供了一个称为配置文件属性的功能,可以存储特定于用户的数据。此功能与会话状态类似,不同的是,在用户的会话过期时,配置文件数据不会丢失。
若要使用配置文件属性,必须对配置文件提供程序进行配置。ASP.NET包括一个SqlProfileProvider类,使你能够将配置文件数据存储到SQL数据库中,但你也可以创建自己的配置文件提供程序类,用于以自定义格式将配置文件数据存储到自定义存储机制,