События управления пользователями не запускаются в Httphandler - PullRequest
3 голосов
/ 21 сентября 2009

События usercontrol uitest.ascx не запускаются, кто-нибудь знает об этом?

        business.Pages.Page page1 = new business.Pages.Page();            

        System.Web.UI.HtmlControls.HtmlForm form = 
              new System.Web.UI.HtmlControls.HtmlForm();
        UserControl uc = 
              (UserControl)page1.LoadControl("~/usercontrols/uitest.ascx");            

        form.Controls.Add(uc);

        page1.Controls.Add(form);

        StringBuilder sb = new StringBuilder();
        StringWriter tw = new StringWriter(sb);
        HtmlTextWriter hw = new HtmlTextWriter(tw);

        page1.RenderControl(hw);            

        context.Response.Write(newContent);

Ответы [ 2 ]

2 голосов
/ 21 сентября 2009

Давайте пройдемся по тому, что здесь произошло. Вы создали экземпляр business.Pages.Page, что означает, что вызывается конструктор класса страницы. Затем вы добавили элемент управления в коллекцию Controls. Затем вы вызвали метод RenderControl() на этой странице.

Нигде в этом процессе вы не инициировали жизненный цикл запроса для страницы. Как могут OnInit, OnLoad и т. Д. Страницы срабатывать, если вы не вызываете какой-либо метод, который их запускает? Во время обычной загрузки страницы страница имеет значение HttpHandler, и конвейер запросов запускает каждое событие, которое, в свою очередь, проходит через дерево элементов управления страницы, вызывая каждый дочерний элемент управления.

Внутренне это делается путем вызова System.Web.UI.Page.ProcessRequest(), который вы, вероятно, могли бы вызвать с помощью отражения, но могут иметь некоторые непредсказуемые результаты.

Здесь следует помнить, что эти классы управления страницами и пользователями не являются специальными - они работают так же, как и любой другой класс. Если вы их new() запустите, конструктор сработает. Если вы вызываете RenderControl(), этот метод срабатывает. Ничего больше, чем это!

1 голос
/ 21 сентября 2009

Если этот код выполняется в пользовательском HttpHandler (как я предполагаю из названия вопроса), то этот подход не будет работать.

Класс Page - это то, что реализует жизненный цикл страницы ASP.Net. Это реализация IHttpHandler. Метод ProcessRequest () объекта Page запускает жизненный цикл страницы - FrameworkInitialize (), Init () ... вплоть до OnLoadComplete (), OnSaveStateComplete ().

Создание объекта страницы путем вызова его конструктора не вызывает жизненный цикл страницы.

...