用户控件事件在HttpHandler中不触发

3

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
让我们逐步分析这里发生的事情。您创建了一个实例business.Pages.Page,这意味着页面类的构造函数被调用。然后,您将控件添加到Controls集合中。接下来,您在该页面上调用了RenderControl()方法。
在这个过程中,您没有启动页面的请求生命周期。如果您不调用某个触发它们的方法,那么页面的OnInitOnLoad等如何触发呢?在正常的页面加载过程中,页面就是HttpHandler,请求管道会触发每个事件,进而通过页面的控件树级联触发每个子控件的事件。
在内部,这是通过调用System.Web.UI.Page.ProcessRequest()来完成的,您可能可以通过反射来调用它,但可能会有一些不可预测的结果。
要记住的关键是,这些页面和用户控件类并不特殊-它们的工作方式与任何其他类相同。如果您对它们进行new()实例化,则构造函数会触发。如果您调用RenderControl(),则该方法会触发。没有比这更多的内容了!

1

如果这段代码在自定义的HttpHandler中运行(我从问题标题中推断出来),那么这种方法是行不通的。

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接