今天跟大家聊聊我最近在搞的ViewStateMode,这玩意儿一开始我也没太当回事,觉得就是个小属性,但真上手,发现里面门道还挺多。
接到个新项目,页面里用到一些复杂的控件,比如GridView,每次PostBack数据都刷刷的,速度慢得让人想砸电脑。我就寻思着是不是哪里没优化各种查资料、改代码,忙活好几天,效果还是不咋地。
后来一个老同事过来瞄一眼,问我:“ViewStateMode你设置吗?” 我当时一脸懵逼,ViewStateMode?这是啥玩意? 赶紧Google一下,才知道原来这货是控制页面和控件是否启用ViewState的。
简单来说,ViewState就是*用来在PostBack之间保存页面和控件状态的机制。
- EnableViewState: 以前的老方法,直接在控件或者页面上设置 EnableViewState="false" 来禁用 ViewState。
- ViewStateMode: 新出的玩法,可以在父控件上统一设置 ViewStateMode,子控件可以继承父控件的设置,也可以自己重写。
然后我就开始尝试。我在Page指令里设置ViewStateMode="Disabled",心想这下总算能快点。结果,页面上很多控件都报错,说找不到ViewState。 后来才明白,有些控件,比如需要回发的,没ViewState根本没法玩。
我把ViewStateMode改回"Enabled",然后开始对页面上的每个控件进行精细化控制。 比如,GridView这种数据量大的控件,我就设置ViewStateMode="Disabled",那些需要保存状态的TextBox或者DropDownList,就保留默认的"Inherit"。
这样做的好处是,既减少ViewState的大小,又保证页面的正常功能。 不过手动一个个设置也挺麻烦的,特别是页面上的控件很多的时候。
为方便,我写个小工具,可以自动分析页面上的控件,根据控件的类型和属性,自动设置ViewStateMode。 比如,如果是数据绑定控件,而且没有启用编辑功能,就自动禁用ViewState。 如果是需要回发的控件,就保留ViewState。
这个小工具大大提高我的效率,也避免手动设置出错的可能。
经过一番折腾,页面的加载速度明显提升,PostBack也快很多。 虽然ViewStateMode只是一个小小的属性,但用对地方,就能起到事半功倍的效果。
下次遇到页面性能问题,不妨看看ViewStateMode,也许它就是你的救星。
总结一下我的经验:
- 不要一股脑的禁用所有ViewState, 要根据实际情况进行分析。
- ViewStateMode的设置是分层级的, 子控件可以继承父控件的设置,也可以自己重写。
- 可以写个小工具, 自动设置ViewStateMode,提高效率。
希望我的实践经验能帮到大家,下次再见!