2009-09-21 42 views
3

uitest.ascx usercontrol事件不會觸發,是否有人有關於它的線索?用戶控件事件不會在Httpndler中觸發

 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()方法。

在這個過程中沒有任何地方發起了頁面的請求生命週期。如果你沒有調用某種激發它們的方法,頁面的OnInitOnLoad等等如何激發?在正常頁面加載期間,頁面HttpHandler,並且請求管道啓動每個事件,該事件又通過頁面的控制樹級聯,觸發每個子控件。

在內部,這是通過調用System.Web.UI.Page.ProcessRequest()完成的,您可以通過反射調用它,但可能會有一些不可預知的結果。

這裏要記住的關鍵是這些頁面和用戶控件類不是特殊的 - 它們和任何其他類一樣工作。如果你new()他們,構造函數觸發。如果您致電RenderControl(),該方法會觸發。沒有比這更多的了!

1

如果這段代碼運行在一個自定義的HttpHandler中(正如我從問題標題中假設的那樣),那麼這種方法是行不通的。

Page類實現ASP.Net Page生命週期。它是IHttpHandler的一個實現。 Page對象的ProcessRequest()方法觸發頁面生命週期 - FrameworkInitialize(),Init()...一直到OnLoadComplete(),OnSaveStateComplete()。

通過調用它的構造函數構造頁面對象不會調用頁面生命週期。