(11)Web程序保存状态的几种方式,Application,Session,Cookie,ViewState
WEb程序保存状态的方式有这样几种:
1.Application:保存在Application中的数据是全局有效的;Application里面存放的应该是访问多修 改较少并且是全局至少大部分功能会使用的数据,例如计数器或者数据库连接串等。
Application.Lock();
((int)Application["Count"])++;
Application.Unlock();
2.Session:在Asp.Net内部,有一个StateApplication来管理Session
3.Cookie
4.ViewState:实际上ViewState并不神秘,就是一个Hidden字段,但是他是服务器控件状态保存的基础
下面我们分别介绍这几种:
ViewState
例如:
<form name="form1" method="post" action="modi_user_info.aspx" language="javascript" onsubmit="javascript:return WebForm_OnSubmit();" id="form1"> <input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" /> <input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" /> <input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKLTIzODM0NzQ5OQ9kFgICAQ9kFgRmDw8WAh4EVGV4dAUHamFzbWluZWRkAgg PDxYCHwAFDDA1OTEwMDAwMDYxM2RkZA==" />
做过Web程序的人可能都有这种痛苦的体会,有时候为了处理页面上面比较复杂的功能,
常常会加很多Hidden,然后在服务器端用一大堆判断来分析目前的状态,写起来烦人,
写完了代码更是难看;实际上,ViewState就是帮我们系统的实现了保存控件状态的功能
,服务器端控件能够在多次请求间保存状态也全靠它。
1、ViewState是存放在客户端,因此会减轻服务器的负担,是一种比较好的保存数据的
方式。
2、因为ViewState本身的限制,只能保存可以序列化的对象,而且最好不要放太多东
西,能省则省,以免在减慢传输的速度,以及加重服务器解析的负担。
3、我们通过很简单的方式就可以把ViewState里面的值获取出来,我们上面讨论了一
些,虽然没有把解析的代码写出来,但是利用LosFormatter可以得到ViewState反序列
化后的对象,那么要解析出来简直是易如反掌;所以ViewState在安全性上面还是比较,建议不要
存放比较机密和敏感的信息,尽管ViewState可以加密,但是由于ViewState要保存在客
户端,天生就有安全性的隐患。
[C#]
// 保存在 ViewState 中
ViewState["SortOrder"] = "DESC"; 字串5
// 从 ViewState 中读取
string sortOrder = (string)ViewState["SortOrder"];
如果要使用 ViewState,则在 ASPX 页面中必须有一个服务器端窗体标记 (<form
runat=server>)。窗体字段是必需的,这样包含 ViewState 信息的隐藏字段才能回传
给服务器。而且,该窗体还必须是服务器端的窗体,这样在服务器上执行该页面
时,ASP.NET 页面框架才能添加隐藏的字段。
在页面不回传的情况下,可以通过省略服务器端的 <form> 标记来去除页面中的
ViewState。
Session
Session值是保存在服务器内存上的,那么,可以肯定,大量使用Session将导致服务器负担加重。另外,Session在默认情况下有一个过期期限,一般是20分钟就过期,但是ViewState则永远不会过期。
提醒:
1.一些与安全性无关,数据量较小,需要长时间操作的参数,应该用ViewState存取。
2.当存在页面回传时,不需要维持控件的值就要把ViewState禁止。
3.ViewState的索引是大小写敏感的
4.ViewState不是跨页面的。
5.控件TextBox的TExtMode属性设置为Password时,它的状态将不会被保存在ViewState中,这应该是出于安全性的考虑。
6.在页面没有回传或者重定向或在回传中转到(transfer)其他页面的时候不要使用ViewState。
7.在动态建立控件时,小心他的ViewState
8.当禁止一个程序的ViewState时,这个程序所有的页面的ViewState也被禁止了。
下面3种方式就可以分别禁用某一个控件、某一个页面和整个应用程序的ViewState。
1) 控件禁用:将控件的EnableViewState属性设置为false;
2) 页面禁用:在页面的Page指令中添加EnableViewState="false";
3) 应用程序禁用:在Web.Config文件中添加程序代码,代码如下:
<configuration> <system.web> <pages enableViewState="false"/> </system.web> < /configuration>
也可以在页面的page指令中禁用 EnableViewState="false"
有的时候我们发现ViewState不能正常传值了,可能是被禁用,再次启用就可以了!
9.只有当页面回传自身时,ViewState才是持续的。