我正在为SharePoint创建一个web部件。我有一个自定义编辑器部分,它覆盖了SyncChanges()和ApplyChanges()方法(以及其他方法)。
问题是,当我在编辑模式下单击OK时,页面将切换到浏览模式,但在EditorPart中更改并保存在ApplyChanges()方法中的数据(属性)不会更新。我必须再次“进入页面”(重新加载而不再次POSTing数据)才能看到所做的更改。
我对它进行了调试,并弄清楚了它在做什么--在编辑模式下单击OK后,首先调用WebPart.CreateChildControls(),然后调用EditorPart.ApplyChanges()。因此,数据已更新,但显示的是未更新的数据。
我在这个行为中发现了另外一些东西:在CreateChildControls()中向我的WebPart添加一个特定的控件会导致调用WebPart.CreateChildControls()和EditorPart.ApplyChanges()的顺序错误。在我的例子中,它会导致添加WebDataTree或UltraWebTree控件(来自Infragistics),但它也可能发生在常见的ASP.NET TextBox中(正如这里详细描述的相同问题:ASP.net forum thread)。
因此,如果我添加树,首先调用CreateChildControls(),然后调用ApplyChanges,所以它不是实际的。我必须刷新才能看到我在编辑器部分中所做的更改。
如果我注释将树添加到controls集合,则首先调用ApplyChanges,然后一切正常(除了我需要该树: ) ...
有人知道是什么导致了这种奇怪的行为吗?
发布于 2010-01-04 19:21:40
调用方法和事件的顺序如下: CreateChildControls ApplyChanges OnPreRender
因此,如果您访问CreateChildControls中的属性,则它们不是最新的。因此,我将访问the部件属性的代码从CreateChildControls迁移到了OnPreRender,一切都正常工作。
发布于 2009-07-23 12:01:54
我不确定这是否是您遇到的问题,但是我遇到的一个问题看起来有点类似,所以我将在这里描述它和我的解决方案。
我的编辑器部件与某些类型的UI控件(即下拉列表)之间存在同步问题。我的问题是,我的web部件属性有下拉值/键,但是当我构建编辑器部件时,当SynchChanges()被调用时,它还没有下拉列表项,所以我不能在那个时候设置我的下拉值。我通过使用同步成员变量来处理这个问题,如下所示。
private DropDownList _dropDownList;
private string _syncDropDownId;
public override SyncChanges()
{
// This will make sure CreateChildControls() is called
// but that doesn't help me with my drop down list data
// which is loaded in OnPreRender()
this.EnsureChildControls();
MyWebPart webPart = this.WebPartToEdit as MyWebPart;
// Temporarily store the drop down value for now
// since our drop down is not fully built yet
_syncDropDownId = myWebPart.SomeId;
}
protected override void CreateChildControls()
{
base.CreateChildControls();
// Create our drop down list, but don't populate it yet
_dropDownList = new DropDownList();
this.Controls.Add(_dropDownList);
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
// Load drop down list items
_dropDownList.Items.AddRange(GetListItems());
// Select item in drop down list based on web part property
if (_syncDropDownId != null)
{
if (_dropDownList.Items.FindByValue(_syncDropDownId) != null)
{
_dropDownList.SelectedValue = _syncDropDownId;
}
_syncDropDownId = null;
}
}发布于 2009-12-23 22:42:40
您可以使用以下命令强制刷新页面:
Page.Response.Redirect(Page.Request.Url.ToString());
https://stackoverflow.com/questions/1170222
复制相似问题