2009-07-23 1 views
4

Я создаю веб-часть для SharePoint. У меня есть пользовательская часть редактора, которая переопределяет методы SyncChanges() и ApplyChanges() (среди прочего).Порядок вызова методов CreateChildControls() и ApplyChanges() в веб-части SharePoint

Проблема заключается в том, что при нажатии кнопки «ОК» в режиме редактирования страница переключается в режим просмотра, но данные (propeties), которые были изменены в редакторе и сохранены в методе ApplyChanges(), не обновляются. Я снова должен «ввести страницу» (перезагрузить без POSTing данных снова), чтобы увидеть изменение, которое было сделано.

Я отлаживал его и выяснял, что он делает - после нажатия OK в режиме редактирования сначала вызывается WebPart.CreateChildControls(), а EditorPart.ApplyChanges(). Таким образом, данные были обновлены, но отображались не обновленные данные.

Я понял что-то еще в этом поведении: Добавление одного конкретного элемента управления в мой WebPart в CreateChildControls() вызывает неправильный порядок вызова WebPart.CreateChildControls() и EditorPart.ApplyChanges(). В моем случае это вызывает добавление элементов управления WebDataTree или UltraWebTree (из Infragistics), но это также может случиться с обычным текстовым блоком ASP.NET (как описано здесь по этой же проблеме подробнее: ASP.net forum thread).

Итак, если я добавлю дерево, CreateChildControls() вызывается первым, а ApplyChanges - вторым, поэтому это не актуально. Я должен обновиться, чтобы увидеть изменения, внесенные мной в часть редактора.

Если я комментарий, добавив дерево в коллекцию элементов управления, ApplyChanges называется первым, и все в порядке (за исключением мне нужно это дерево :)) ...

Кто-нибудь знает, что может вызвать это странное поведение?

+0

Нет ответа, просто подтверждение того, что вы не только один собирается, хотя эту боль. После нескольких часов попыток бороться с этой конкретной проблемой я сдал и просмотрел элементы управления внутри самой веб-части, когда находится в режиме редактирования. – Tom

+0

Иди в это. Пришлось переместить код в OnPreRender. –

ответ

2

Я не уверен, что это то, с чем вы сталкиваетесь, но проблема, которая у меня была, кажется несколько похожей, поэтому я опишу ее здесь вместе с моим решением.

У меня есть проблемы с синхронизацией в моих частях редактора с некоторыми типами элементов управления пользовательского интерфейса (а именно, выпадающих списков). Моя проблема заключается в том, что у моего свойства веб-части есть значение drop/value, но когда я создаю часть моего редактора, у него еще нет выпадающих элементов списка, когда вызывается 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; 
    } 
} 
0

Вы можете принудительно обновить страницы с помощью:

Page.Response.Redirect (Page.Request.Url.ToString());

4

Порядок методов призывающих и evetns это: CreateChildControls ApplyChanges OnPreRender

Так, если доступ к свойствам в CreateChildControls они не являются текущими. Итак, я переместил код, который обеспечивает доступ к свойствам веб-страницы из CreateChildControls в OnPreRender , и все работает правильно.

0

Порядок использования методов не будет

protected override void CreateChildControls() 
{ 

} 

public override void SyncChanges() 
{ 

} 

public override bool ApplyChanges() 
{ 

} 
Смежные вопросы