События .NET Control и жизненный цикл страницы - PullRequest
0 голосов
/ 27 марта 2009

Вот проблема .... У меня есть три компонента ... Страница, которая содержит пользовательский элемент управления и серверный элемент управления, который находится в пользовательском элементе управления. Пользовательский элемент управления содержит несколько событий, которые прослушивает страница, которые меняют действия серверного элемента управления.

Серверный элемент управления по существу создает список, похожий на TV Guide, заполненный множеством меньших элементов управления ASP.NET, которые должны иметь события. Все эти элементы управления создаются динамически (очевидно, на стороне сервера). Заполнение этого серверного элемента управления требует интенсивных операций и, следовательно, должно выполняться только один раз для обратной передачи. Event1 и Event2 срабатывают и, в основном, изменяют вещи в рендеринге серверных элементов управления (сортировка, фильтрация и т. Д.), Поэтому при их срабатывании мне обязательно нужно вызвать PopulateControls.

Вот проблема: я не могу найти лучшее место, чтобы позвонить в PopulateControls. Если я помещаю его в PageLoad, он запускается и рисует список перед любыми событиями. Тогда мои события должны сами вызывать PopulateControls, чтобы ответить на событие. Если я помещаю вызов в PreRender, события серверного элемента управления не запускаются, потому что из того, что я прочитал, они должны быть созданы до или во время PageLoad.

Итак, куда мне поместить этот вызов, чтобы мне нужно было вызывать его только один раз и чтобы он мог реагировать на соответствующие события?

Вот какой-то код псевдо

public class MyPage : System.Web.UI.Page
{
    protected UserControl MyUserControl;

    // Wire up event handlers
    MyUserControl.Event1 += OnEvent1;
    MyUserControl.Event2 += OnEvent2;

    public Page_Load()
    {
    }

    public PreRender()
    {
        PopulateControls();
    }

    private PopulateControls()
    {
        // Do intensive operation to populate controls
    }

    protected OnEvent1()
    {
    }

    protected OnEvent2()
    {
    }
}

Ответы [ 3 ]

1 голос
/ 27 марта 2009

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

Edit: Вы должны быть в состоянии воссоздать свои элементы управления и иерархию элементов управления после отправки. Вы должны отправить достаточно информации клиенту, чтобы вы могли правильно воссоздать элементы управления в Postback. Это можно сделать, сохранив информацию в ViewState, если необходимо.

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

Основной поток должен быть таким. В событии Load, если у вас нет ViewState, необходимого для создания элементов управления, вызовите метод populate, в противном случае создайте их из ViewState. Когда происходит обратная запись, событие Load создает их, но они восстанавливаются из состояния просмотра, поэтому это должно быть дешево. Когда происходит событие post back, вызовите метод populate, чтобы воссоздать элементы управления в новом порядке или с новой информацией, в зависимости от того, какое событие произошло.

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

Я отредактировал свой ответ, и, надеюсь, теперь он стал немного понятнее.

0 голосов
/ 27 марта 2009

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

Вот достойная статья, которая обсуждает жизненный цикл страницы с пользовательскими элементами управления: http://www.codeasp.net/articles/asp.net/20/aspnet-page-lifecycle

0 голосов
/ 27 марта 2009

Дочерние элементы управления должны быть созданы в CreateChildControls, который вызывается на этапе "Init" жизненного цикла элемента управления.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...