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);
答案 0 :(得分:2)
让我们逐步了解这里发生的事情。您已经创建了一个实例business.Pages.Page
,这意味着调用了页面类的构造函数。然后,您已将控件添加到Controls
集合中。然后,您在该页面上调用了RenderControl()
方法。
在该过程中,您没有为页面启动请求生命周期。如果您没有调用某个触发它们的方法,页面的OnInit
,OnLoad
等如何触发?在正常页面加载期间,页面是 HttpHandler
,请求管道启动每个事件,然后通过页面的控制树级联,触发每个子控件。
在内部,这是通过调用System.Web.UI.Page.ProcessRequest()
来完成的,您可以通过反射调用它,但可能会产生一些不可预测的结果。
这里要记住的关键是这些页面和用户控件类并不特殊 - 它们的工作方式与其他任何类相同。如果你new()
了,构造函数就会触发。如果您致电RenderControl()
,则会触发该方法。没什么比这更重要了!
答案 1 :(得分:1)
如果此代码在自定义HttpHandler中运行(正如我从问题标题中假设的那样),那么这种方法不会起作用。
Page类实现了ASP.Net页面生命周期。它是IHttpHandler的一个实现。 Page对象的ProcessRequest()方法触发页面生命周期 - FrameworkInitialize(),Init()......一直到OnLoadComplete(),OnSaveStateComplete()。
通过调用它的构造函数构造页面对象不会调用页面生命周期。