Pre Render Master Pages и ViewState

Вот другой код, который в значительной степени говорит сам за себя. В отделенном коде происходят некоторые вещи с состоянием просмотра, а затем есть панель обновления. КОГДА я добавляю это на дочернюю страницу, на которую ссылается мастер-страница, это нарушает все ранее работавшие функции, которые у меня были раньше из моих пользовательских элементов управления.
Код дочерней страницы для мастер-страницы:

    protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                    GetBrands();
                    GetStyles();
                    GetColors();
                    this.BindItemsList();
                }
            }
            catch (Exception)
            { }


        }

person user694071    schedule 21.10.2012    source источник
comment
покажите какой-нибудь код, и есть ли что-нибудь из этого в updatepanel?   -  person peroija    schedule 21.10.2012
comment
Кода много. Но все состояние просмотра находится на панели обновлений, а все остальное — нет. его в веб-элементе управления помещают на главную страницу, а состояние просмотра загружается с дочерней страницы на главную страницу. Спасибо за ответ.   -  person user694071    schedule 21.10.2012


Ответы (3)


Попробуйте удалить файл UpdatePannel. Если это исправит ваш код, вы изолируете проблему от своей реализации около ViewState. Проблемы с UpdatePannels и ViewState не редкость.

person andleer    schedule 21.10.2012

PreRender срабатывает после обработки управляющих событий. Любой элемент управления, добавленный во время PreRender, будет игнорировать все события, связанные с элементом управления.

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

PreRender — это хорошее место для изменения внешнего вида элементов управления или добавления разметки, не связанной с событиями.

person andleer    schedule 21.10.2012

Вам необходимо переопределить методы CreateChildControls вашей главной страницы и заполнить элементы управления в этом методе. Этот метод следует использовать для создания дочерних элементов управления в коде за классом страниц и серверных элементов управления. Это должно решить проблему, связанную с тем, что Viewstate не восстанавливается для заполненных элементов управления. Кроме того, иногда проблема с восстановлением Viewstate может заключаться в том, как вы добавляете свои элементы управления в метод PopulateControls. Вы должны убедиться, что сначала элементы управления контейнерами (например, панель или т. д.) добавляются в коллекцию элементов управления, и только затем элементы управления добавляются в эти контейнеры.

В любом случае вам нужно попробовать что-то вроде этого:

/// <summary>
/// Called by the ASP.NET page framework to notify server controls that use composition-based 
/// implementation to create any child controls they contain in preparation for posting back or rendering.
/// </summary>
protected override void CreateChildControls()
{
    base.CreateChildControls();
    PopulateControls();
}
person Maxim Kornilov    schedule 21.10.2012
comment
CreateChildControls() — это метод Control, а не Page или MasterPage. Я думаю, вы путаете метод PopulateControls() спрашивающего с похожими именами в фреймворке. - person andleer; 21.10.2012
comment
MasterPage наследуется от класса UserControl. Итак, класс MasterPage и Page поддерживает метод CreateChildControls. Вы можете проверить это в MSDN или просто попытаться переопределить этот метод. Это ссылка на страницу MSDN: msdn.microsoft.com /ru-ru/library/system.web.ui.masterpage.aspx - person Maxim Kornilov; 21.10.2012
comment
@andleer Вы совсем не правы. MasterPage имеет метод CreateChildControls. - person Maxim Kornilov; 21.10.2012
comment
@maxim следует ли вызывать CreateChildControls() из кода основной страницы или пользовательского элемента управления? Если на главной странице, у меня возникают проблемы с созданием заполнителя контента и поиском элементов управления (в этот момент все они пусты). Что было бы проще изменить вызовы жизненного цикла страницы или просто избавиться от панели обновления? - person user694071; 21.10.2012
comment
@ user694071 Не могли бы вы указать, что делает ваш метод заполнения. Создает ли он какие-либо элементы управления динамически (со стороны сервера). Вы создаете какие-либо другие элементы управления динамически? - person Maxim Kornilov; 21.10.2012
comment
Это как-то связано с состоянием просмотра и панелью обновления. Они. не работают, когда я добавляю мастер-страницу в свой aspx и b. они нарушают существующую функциональность. т.е. если я добавляю в корзину, страница не обновляется правильно. - person user694071; 21.10.2012
comment
@user694071 user694071 Я просмотрел ваш код и не вижу проблемы. У меня есть только предложение, чтобы вы попытались вызвать привязку данных (не только во время начальной загрузки страницы, когда Page.IsPostBack равно false), чтобы проверить, решит ли это проблему. Если это решит вашу проблему, то причина проблемы в том, что коллекция элементов управления, созданная во время обратной передачи, отличается от той, что была во время начальной загрузки страницы. - person Maxim Kornilov; 21.10.2012