Порядок вызова методов CreateChildControls () и ApplyChanges () в веб-части SharePoint

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

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

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

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

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

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

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


person Community    schedule 23.07.2009    source источник
comment
Нет ответа, просто признание того, что вы не единственный, кто проходит через эту боль. После нескольких часов попыток решить эту конкретную проблему я сдался и визуализировал элементы управления внутри самой веб-части в режиме редактирования.   -  person Tom    schedule 02.10.2009
comment
Вбежал и в это. Пришлось перенести код в OnPreRender.   -  person J c    schedule 11.08.2011


Ответы (4)


Порядок вызова методов и событий следующий: CreateChildControls ApplyChanges OnPreRender

Поэтому, если вы получаете доступ к свойствам в CreateChildControls, они не актуальны. Поэтому я переместил код доступа к свойствам веб-части из CreateChildControls в OnPreRender, и все работает правильно.

person Vojtech Nadvornik    schedule 04.01.2010

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

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

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

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

person Ciprian Grosu    schedule 23.12.2009

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

protected override void CreateChildControls()
{

}

public override void SyncChanges()
{

}

public override bool ApplyChanges()
{

}
person user3386930    schedule 06.03.2014