由于项目的需求,其实也可以说不是,只是Web Application中的部分页面实在太大,有些页面体积超过了2M,这其中又以ViewState为最,因为偶的PM对UI的要求甚高,可以说是极高,所以不得不运用了很多特效,其实光页面本身的功能,应该说所占用的带宽是很少的。
鉴于网络带宽的限制以及不少客户的抱怨,我们Team不得不想办法把页面中体积巨大的ViewState想办法挪位,使其不用默认的隐藏字段来存储,而是用Session来存储,Session是存储在Server上的,所以变相的也把ViewState存储到Server上了。
其实这方面的资料很多,随便搜搜就有很多,无外乎是这么一段代码。
protected override PageStatePersister PageStatePersister
{
get { return new SessionPageStatePersister(this); }
}
呵呵,其实这段代码的确起作用,但是这只解决了问题的一半,问题出现在GridView上的DataKey,这个ControlState会丢失,原因是SessionPageStatePersiste可能被多次调用。所以你会发现,当你去点击GridView具体某行数据的Edit时,会需要这个DataKey,而这个时候会出现Index is out of range这个错误。
所以必须用下列这段代码来替代之前的那段,才能把问题彻底解决。
PageStatePersister _pers;
protected override PageStatePersister PageStatePersister
{
get
{
if (_pers == null)
_pers = new SessionPageStatePersister(this);
return _pers;
}
}
你可以把这段代码放在你的基类中,这个类继承于System.Web.UI.Page,这样就不用每个页面都去手工加载。