化恶魔为天使,巧移ViewState至SqlServer
(发文后记:还是说清楚前提吧,本文只适用于当不得已才使用ViewState的情况) ViewState 一直以来备受争议,主要是因为他臃肿的体积,导致客户的的回传( PostBack )数据量很大,而其中真正有用的数据又很少,网络带宽被浪费不说,用户的体验也很差。 最近
(发文后记:还是说清楚前提吧,本文只适用于当不得已才使用ViewState的情况)
ViewState一直以来备受争议,主要是因为他臃肿的体积,导致客户的的回传(PostBack)数据量很大,而其中真正有用的数据又很少,网络带宽被浪费不说,用户的体验也很差。
最近项目中用到了Telerik的RadGrid,使用服务器端绑定数据后页面ViewState体积过大,而导致性能严重降低,便开始找寻优化方式,尽量将ViewState存在服务器端。
由于项目已开发至中期,不可能做类似于取消ViewState或使用客户端绑定之类的大规模改动。
要想改动量最小化,肯定不能影响原有ViewState的使用,那只能重写Page类的LoadPageStateFromPersistenceMedium()和SavePageStateToPersistenceMedium(object state)的方法,在这两个Override的方法中把数据存在别的什么地方。
这时候就来问题了,ViewState只是一个页面的周期,每打开一个页面都会生成一个新的ViewState,连刷新都不例外,如果存在文件或数据库中,这些数据累积起来可不是开玩笑的,而且也用不上了,那还不得要写过期删除的方法么?太麻烦了。这时候,Session就发挥大作用了,Session的生命周期长于ViewState,过期会自动删除,而且还是存在服务器端的,不会增加数据传输量,看来很合适。
代码如下: