用户控制事件不会在Httphandler中触发

时间:2009-09-21 01:01:14

标签: asp.net user-controls event-handling httphandler

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 个答案:

答案 0 :(得分:2)

让我们逐步了解这里发生的事情。您已经创建了一个实例business.Pages.Page,这意味着调用了页面类的构造函数。然后,您已将控件添加到Controls集合中。然后,您在该页面上调用了RenderControl()方法。

在该过程中,您没有为页面启动请求生命周期。如果您没有调用某个触发它们的方法,页面的OnInitOnLoad等如何触发?在正常页面加载期间,页面 HttpHandler,请求管道启动每个事件,然后通过页面的控制树级联,触发每个子控件。

在内部,这是通过调用System.Web.UI.Page.ProcessRequest()来完成的,您可以通过反射调用它,但可能会产生一些不可预测的结果。

这里要记住的关键是这些页面和用户控件类并不特殊 - 它们的工作方式与其他任何类相同。如果你new()了,构造函数就会触发。如果您致电RenderControl(),则会触发该方法。没什么比这更重要了!

答案 1 :(得分:1)

如果此代码在自定义HttpHandler中运行(正如我从问题标题中假设的那样),那么这种方法不会起作用。

Page类实现了ASP.Net页面生命周期。它是IHttpHandler的一个实现。 Page对象的ProcessRequest()方法触发页面生命周期 - FrameworkInitialize(),Init()......一直到OnLoadComplete(),OnSaveStateComplete()。

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