最近一段时间被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,再动态绑定数据,还有很多想不明白,先挖个坑。

 

posted on 2011-12-29 10:40  gzh4455  阅读(258)  评论(0编辑  收藏  举报