当前位置: 代码迷 >> ASP >> Asp.Net的状态治理
  详细解决方案

Asp.Net的状态治理

热度:316   发布时间:2013-01-26 13:47:03.0
Asp.Net的状态管理

页面重新加载时,页面中定义全局变量会被清零,也就是说不能保存状态

(由于HTTP协议的无状态特性,导致在ASP.NET编程中,每个请求都会在服务端从头到执行一次管线过程,对于ASP.NET页面来说,Page对象都会重新创建,所有控件以及内容都会重新生成)

 

这里介绍6种保存状态的方法,帮助我们实现页面之间或者整个用户会话期间保留状态数据。

 

QueryString

查询字符串是存在于URL 结尾的一段数据。下面是一个典型的查询字符串示例(红色部分文字):

http://www.abc.com/demo.aspx?k1=aaa&k2=bbb&k3=ccc

查询字符串经常用于页面的数据过滤,例如:

1.给列表页面增加分页参数,list.aspx?page=2

2.给列表页面增加过虑范围,Product.aspx?categoryId=5

 

优点:

1. 实现简单:在服务端直接访问Request.QueryString[]可读取数据。

2. 页面传值简单:<a href="url">或者 Response.Redirect(url)都可以实现。

 

缺点:

1.有长度限制。

2.用户可见,不能保存敏感数据。

 

 

ViewState

viewstate是页面级别的。只要这个页面在,viewstate中存的数据就在。

例如

ViewState存放数据:

ViewState[key] = value;

ViewState.Add(key, value);

 

取出数据:

TempStr = ViewState[key];key不存在时返回空。

 

缺点:

  1. 视图状态的数据只能用于回发(postback)

 

ApplicationState

ApplicationState为应用程序提供了一个全局的状态。所有客户都可以使用该状态。

例如

在Global.asax的Application_Start函数中存储数据:

void Application_Start(object src, EventArgs e)   

{  

int exp = 0;   

Application["Experiment"] = exp;   

}  

 

现在你可以在任意页面下使用它:

private void Page_Load(object src, EventArgs e)   

{  

int expr = Int32.Parse((Application["Experiment"]));  

}  

 

跟使用全局的静态信息差不多,还是尽量不用的好。

 

 

Session

Session状态是在登录网站时候创建的,存储在服务端。只要这次会话没有过期session中存的数据就在

例如

Session(“Value”) = expr ; 

 

private void Page_Load(object src, EventArgs e)   

{   

string strExpr =Session["Value"].ToString() ;   

}  

 

当访问网站的人数很多时,服务器会很累的。

 

 

cookie

Cookies则有两种方法 , 一种方法是把值保存在浏览器的变量中 , 当浏览器关闭时结束 ,另一种方法是保存在硬盘中 , 只要时间不过期 , 下次还可使用

请见javascript控制Cookie,保留用户登录信息 JavaScript cookie详解

 

HiddenField

增加HiddenField,其实是为了让整个状态管理机制的应用程度更加全方面。因为不管是ViewState、Cookie还是Session,都有其失效的时候,比如用户因某种需求设置ViewState为false,或环境条件限制使用Cookie,或用户长时间没有动作导致Session过期等等,那这个时候HiddenField无疑是最佳选择。

 

HiddenField控件的作用简单的说是用于存储需要在向服务器的发送间保持的值。他作为<inputtype= "hidden"/> 元素呈现,并且通过添加runat=”server”就能使他成为标准的HTML服务器控件。

 

<input type="hidden" name="hidden-1"value="aaaaaaa" runat="server"/>

另外,还可以调用ClientScript.RegisterHiddenField()方法来创建隐藏域:

ClientScript.RegisterHiddenField("hidden-2", "ddddddddd");

 

private void Page_Load(object src, EventArgs e)   

{   

string strValue = hidden-1.Value;

}  

 

小结

当在c/s程序中,直接使用全局变量就可以做到保存状态;而在b/s中,全局变量不好使了,却出现了n多解决的方法,这时我发现:办法总比问题多


  相关解决方案