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">中的CallStackAllowPageLevelTrace的属性设置为“true”。
             2、<customErrors mode="On" />的mode改为"Off"
Step4:  再次运行,就得到详细的错误信息:SPList没有被标记为可序列化!
------------------------
至此,才明白出错以及为什么跟不进Render方法的原因,原来是要保存SPList时,无法将对象序列化。
注:ViewState存储的对象需要是可序列化的。
------------------------
这么一个错误,道道还是不少,希望对大家有用~~
posted @ 2009-09-05 16:37  mcjeremy  阅读(901)  评论(2编辑  收藏  举报
------------------------------------ 心静似高山流水不动,心清若巫峰雾气不沾 ------------------------------------