2009-09-21 44 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()。

通过调用它的构造函数构造页面对象不会调用页面生命周期。