我正在为SharePoint创建一个Web部件。我有一个自定义编辑器部分,该部分将覆盖SyncChanges()和ApplyChanges()方法(以及其他方法)。
问题是,当我在编辑模式下单击“确定”时,页面切换到浏览模式,但是在EditorPart中更改并保存在ApplyChanges()方法中的数据(属性)未更新。我必须再次“进入页面”(重新加载而无需再次发布数据)才能看到所做的更改。
我对其进行了调试,并弄清楚了它的作用-在编辑模式下单击“确定”后,首先调用WebPart.CreateChildControls(),然后调用EditorPart.ApplyChanges()。因此,数据已更新,但显示的是未更新的数据。
我发现此行为有其他问题:在CreateChildControls()中向我的WebPart添加一个特定控件会导致调用WebPart.CreateChildControls()和EditorPart.ApplyChanges()的顺序错误。在我的情况下,这会导致添加WebDataTree或UltraWebTree控件(来自Infragistics),但也可能在常见的ASP.NET TextBox中发生(如此处详细描述了相同的问题:ASP.net forum thread)。
因此,如果我添加树,则首先调用CreateChildControls(),然后调用ApplyChanges,因此这是不实际的。我必须刷新才能看到在编辑器部分中所做的更改。
如果我评论将树添加到控件集合中,则首先调用ApplyChanges,一切正常(除非我需要那棵树:))...
有谁知道会导致这种奇怪行为的原因吗?
最佳答案
调用方法和evetns的顺序是这样的:
CreateChildControls
应用更改
OnPreRender
因此,如果您访问CreateChildControls中的属性,则它们不是当前的。
所以我将访问webpart属性的代码从CreateChildControls移到了OnPreRender
一切正常。