,转ASP.NET状态管理

同样,听了微软讲师邵志东的讲座“ASP.NET状态管理”的视频讲座,总结如下,希望得到大家的指点:

第一部分:页面状态介绍

Http协议————“无状态协议”

Web服务器每分钟对上千个用户进行管理的一种方式是执行所谓的“无状态”链接。只要有一个希望浏览器返回一个页面、图象或其他资源的请求,就发生以下事情:

1,连接到服务器;

2,告诉服务器想要的页面、图象或其他项;

3,服务器发送请求的资源;

4,服务器切断连接,把用户忘的干干净净。

也就是说页面之间在Http协议下没有任何联系,这样就需要有状态管理来传输页面之间的数据。

web页面处理过程:

1,页面的一次往返处理:用户对服务器控件的一次操作,就可能引起一次往返处理。页面被提交到服务器端,执行响应的事件处理代码,重建页面,然后返回到客户端。

2,页面重建:每一次页面被请求,或者页面事件被提交到服务器,ASP.NET运行环境执行必要的代码,重建整个页面,把结果页面送到浏览器,然后抛弃页面的变量、控件的状态和属性等页面信息。

3,页面内部处理过程:

  (1)Page_Load:IsPostBack属性判定页面是否为第一次被请求。

  (2)事件处理:这一阶段处理表单的事件。

  (3)Page_Unload:这一阶段页面已经处理完毕,需要做些清理工作。一般的你可以在这阶段关闭打开的文件和数据库链路,或者释放对象。

ASP.NET Web Form框架的“连续”和“有状态”假象:

访问者打开页面的连续画面,实际上是一种假象,这种假象是由ASP.NET页框架、页及其控件实现的。

第二部分:基于客户端的状态管理

状态信息放在客户端上。

一、视图状态(ASP.NET特有);

二、隐藏的窗体域;

三、Cookie

四、查询字符串。

一、视图状态

ASP.NET使用了ViewState视图状态,是所有服务器控件的一个属性。如果你查看Web Form产生的HTML代码,可以查看到一个名为_ViewState的隐藏字段,ASP.NET将状态信息以Hash的方式存储在这里,通过它可以在下一次回发前知道回发前的各控件的状态。

<input type="hidden" name="__VIEWSTATE"  value="/wEPDwUILTMyNDAxOTkPZBYCAgQPZBYEAgMPDxYCHgRUZXh0BRvlvZPliY3nlKjmiLfvvJrotoXnuqfnlKjmiLdkZAIHD2QWAmYPDxYGHgtDZWxsUGFkZGluZ2YeC0NlbGxTcGFjaW5nZh4EXyFTQgKAgBhkFiYCAQ9kFgJmD2QWAmYPZBYCZg88KwAJAQAPFgYeDU5ldmVyRXhwYW5kZWRkHgxTZWxlY3RlZE5vZGVkHglMYXN0SW5kZXgCEGRkAgMPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAgUPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCBWRkAgcPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAgkPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCIWRkAgsPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCA2RkAg0PZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCA2RkAg8PZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAhEPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCBGRkAhMPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCCWRkAhUPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAhcPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCBGRkAhkPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAhsPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAh0PZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCA2RkAh8PZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCBmRkAiEPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCCWRkAiMPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCAmRkAiUPZBYCZg9kFgJmD2QWAmYPPCsACQEADxYGHwRkHwVkHwYCA2RkGAEFHl9fQ29udHJvbHNSZXF1aXJlUG9zdEJhY2tLZXlfXxYTBQ9MZWZ0TWVudTEkY3RsMDAFD0xlZnRNZW51MSRjdGwwMQUPTGVmdE1lbnUxJGN0bDAyBQ9MZWZ0TWVudTEkY3RsMDMFD0xlZnRNZW51MSRjdGwwNAUPTGVmdE1lbnUxJGN0bDA1BQ9MZWZ0TWVudTEkY3RsMDYFD0xlZnRNZW51MSRjdGwwNwUPTGVmdE1lbnUxJGN0bDA4BQ9MZWZ0TWVudTEkY3RsMDkFD0xlZnRNZW51MSRjdGwxMAUPTGVmdE1lbnUxJGN0bDExBQ9MZWZ0TWVudTEkY3RsMTIFD0xlZnRNZW51MSRjdGwxMwUPTGVmdE1lbnUxJGN0bDE0BQ9MZWZ0TWVudTEkY3RsMTUFD0xlZnRNZW51MSRjdGwxNgUPTGVmdE1lbnUxJGN0bDE3BQ9MZWZ0TWVudTEkY3RsMThhvz2XbcWenPMmfNNLRf3pN2JrYw==" />

ASP.NET服务器控件的生命周期:

1、初始化——Init事件(OnInit方法)

2、加载视图状态——LoadViewState方法(当页面回发时,首先从_ViewSatae字段信息中加载该控件的状态)

3、处理回发数据——LoadPostData方法

4、加载——Load事件(OnLoad方法)

5、发送回发更改通知——RaisePostDataChangedEvent方法

6、处理回发事件——RaisePostBackEvent方法

7、预呈现——PreRender事件(OnPreRender方法)

8、保存视图状态——SaveViewState方法

9、呈现——Render方法

10、处置——Dispose方法

11、卸载——UnLoad事件(OnUnLoad方法)

视图状态的使用方法:

1,启用视图状态,即EnableViewState="true"。默认为True,如果为False,该控件和子控件的视图状态就不会被串行化。

2,可以在视图状态中存储的类型:Int32,bool,string,color,array,arrayList,Unit以及以上类型的HashTable对象。

3,视图状态与安全

视图状态串行化的字符串表达式作为明文来往返传送,这是不安全的,在视图状态中绝不能保存任何信息(例如口令、连接字符、文件路径等。)

参考例子(ViewState.aspx和ViewState_userinfo.aspx)

using System;
using System.Data;
using System.Configuration;
using System.Collections;
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;
namespace ASPNETState
{
public partial class ViewState : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
Label1.Text = "EnableViewState=True";
//EnableViewState设为True时,Lable1的状态保存在_viewState隐藏字段中,当刷新页面时,不执行此语句,但是可以从_ViewState中取到以前的状态信息,所以还是原值。
Label2.Text = "EnableViewState=False";
//EnableViewState设为False时,Lable2的状态没有保存在_viewState隐藏字段中,当刷新页面时,不执行此语句,并且取不到以前的状态信息,所以为空。
}
}
protected void Button2_Click(object sender, EventArgs e)
{
if (ViewState["count"] == null)  //从ViewState中读数据
{ 
ViewState["count"] = 0;    //向ViewState中保存数据(可以保存多种类型的数据)
}
int ncount = (Int32)ViewState["count"];
ncount += 1;
ViewState["count"] = ncount;
Label3.Text = ViewState["count"].ToString();
}
protected void Button1_Click(object sender, EventArgs e)
{
}
}
}

二、隐藏的窗体域

隐藏域不会显示在用户浏览器中,但是我们可以像设置标准控件属性一样设置其属性。当一个网页被提交给服务器时,隐藏域的内容和其他控制的值一块儿被送到Http Form集合中。隐藏域可以是任何存储在网页中与网页有关的信息的储存库,隐藏域在其value属性中存储一个变量,而且必须被显示地添加在网页上。

ASP.NET中的HtmlInputHidden控制提供了隐藏域的功能