当页面重新加载时,页面中定义的全局变量会被清零,也就是说不能保存状态
(由于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不存在时返回空。
缺点:
- 视图状态的数据只能用于回发(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多解决的方法,这时我发现:办法总比问题多。