SharePoint对象模型与ViewState
ViewState对于大家来说,应该是一点都不陌生的。虽然在ASP.NET中到处可见它的踪迹,但是,我却很少使用它。
近日,在开发WebPart时,为了避免每一次刷新页面都要重新获取同一个SPList,因此,我使用了ViewState存储
SPList对象,但是很不幸的是,编译时完全正常,但是到使用时,却很不给面子的一直弹“发生意外错误”。对于这个问题的解决,我经历了如下几步,希望对大家有所帮助:
Step1: 我跟踪调试WebPart,直到该WebPart的PreRender事件函数执行完毕,就会导致页面意外错误,而且无法再跟踪到
Render中(因为我的代码中没有重写SaveViewState函数)。
联想到PreRender事件之后,应该执行的是保存ViewState(即SaveState),而我的WebPart中只有SPList这里用了
ViewState,那问题多半出在这里了,但是,具体是什么错呢?没辙,因为我跟不进去。
Step2: 默认情况下,SharePoint出错显示的都是友好信息,而且友好到您基本上无法明白到底出什么错。
很郁闷的是,一般情况下,我建一个站点,都会更改web.config ,让它显示详细的错误信息,但是,部署webpart
的这个站点,我偏偏没有更改!
Step3: 更改web.config,让SharePoint能显示更详细的错误信息:
1、 将<SafeMode ... CallStack="false" ...... AllowPageLevelTrace="false">中的CallStack和AllowPageLevelTrace的属性设置为“true”。
2、<customErrors mode="On" />的mode改为"Off"
Step4: 再次运行,就得到详细的错误信息:SPList没有被标记为可序列化!
------------------------
至此,才明白出错以及为什么跟不进Render方法的原因,原来是要保存SPList时,无法将对象序列化。
注:ViewState存储的对象需要是可序列化的。
------------------------
这么一个错误,道道还是不少,希望对大家有用~~
<h3>
心静似高山流水不动,心清若巫峰雾气不沾。
</h3>