最近一段时间被WebPart 折腾得够厉害的,所以现在有很多必要记录一下犯错的经过。最重要是记录一下WebPart的生存周期,下面有部分的内容是转载的。
了解一个WebPart的生存周期,对我们在开发Webpart时很有帮助,只有你清楚地了解了这些事件执行的先后顺序
才能写出优美的代码。
当一个包含WebPart的WSS站点页面被响应请求或者是它被提交到Server端的时候,这时WebPart生存周期开始了:
OnInit |
初始化,加载相关配置文件 (如WebPart任务面板上的属性,样式等配置信息) |
LoadViewState |
返回先前最后一次被处理的状态 (如webpart是展现,隐藏还是关闭) |
CreateChildControls |
创建WebPart UI ,通过Controls.Add()方法装载Web 控件 (Note:当Webpart是第一次展现的时候CreateChildControls方法发生在OnLoad方法之前,而经过一次postback之后,它发生在OnLoad方法之后) |
OnLoad |
从数据库或者其他系统重新获取要展现的数据 (如获取数据库连接) |
PreRender |
在这个方法你可以输出HTML及注册JS、CSS文件 |
Render |
将图形界面展现在页面上 |
User-Generated Events |
响应用户生成事件 (如Button Click) |
RendenContents |
生成 html output,实现最终的UI展现 (由HTMLTextWriter class 来实现) |
SaveViewState |
保存控件状态 (ViewState 被序列化之后保存在一个hidden field 里) |
Dispose |
从内存中移除对象,释放临界资源 (如释放数据库连接) |
OnUnLoad |
最终完成内存清除工作 |
一般来说我我们会在CreateChildControls 这个方法里面配置控件的属性,控件的绑定的方法,诸如Button的click, 还有Spgridview数据绑定的方法之类的,但是我们同时要把这个控件添加到父控件中,如this.Controls.Add(SPGridView1), 但对于需要布局来说非常之不好,很难控制其位置。如果直接输出可以用到this.Controls.Add(new LiteralControl("</div>")); 这种方法来输出HTML。
但是有一点令人非常讨厌,如果你在这里输出的HTML绑定了一些变量及的值,那么你需要在之前就操作过一遍,然后CreateChildControls方法之后,其会操作Renderi 及PreRener 方法,然后再会执行其控件的数据源绑定,其在这个时候Webpart的所有属性的值都会变成成默认的, 如果你在你默认的方法中读取WebPart属性值的时候,那不是你原来WebPart设置的属性值。
所以你会想到如果在RenderContent方法中生成HTML,output的时候,在这个方法呀添加 this.Controls.Add(SPGridView1),输出HTML的时候,你会发觉最后之前SPGridView1的绑定的方法GetDateTable在RenderContent方法执行后再执行其绑定。那就会很郁闷,其所有的值都会变成WebPart还没有设置属性值的默认值。最后,在这里输出的HTML就会没有效果。
现在还没有好的方法来解决这个问题,只能先放到CreatChildControls然后其控件属性值绑定后再执行多一遍。
先输静态HTML,再动态绑定数据,还有很多想不明白,先挖个坑。