2009-09-21 2 views
3

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

 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

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

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

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

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

1

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

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

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

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