1

我有一个用户控件(导航)嵌套在另一个用户控件(标题)中,该控件是从控件类(标准)动态加载的。

用户控件、Navigation 和 Header 的 AutoEventWireup = false。

控件类 Standard 调用从配置项加载 Header 用户控件。

private void layoutAndRender(HtmlTextWriter output, string UserControlKey, NameValueCollection UserControlsConfiguration)
{
    if(UserControlsConfiguration[UserControlKey] != null && UserControlsConfiguration[UserControlKey].ToString() != "")
    {
        string suc = System.Web.HttpContext.Current.Request.ApplicationPath + UserControlsConfiguration[UserControlKey].ToString();
        UserControl ucToRender = (UserControl)this.Page.LoadControl(suc);
        ucToRender.RenderControl(output);
    }
}

我的问题是我想在 Navigation 用户控件中初始化一个可以接受 Page.Request 和 Page.Response 的对象,但是在后面的 Navigation 代码中似乎没有触发事件。

我用来初始化我的对象的代码是:

this.browser = new Browser(this.Request, this.Response);

我尝试在 Navigation 构造函数期间执行此操作,但此时未设置 this.Request 和 this.Response。

我尝试在void Page_Load(object sender, System.EventArgs e)方法中使用该语句,但这似乎没有触发,即使我this.Load += new System.EventHandler(this.Page_Load);在 Navigation 构造函数中有。

我还为 Page_Init 和 Page_PreRender 尝试了类似的语句,但这些语句似乎都没有触发。

是否加载了 LoadControl 的控件不会触发 Load 或 Init 事件,如果以我加载它们的方式加载,并且它可能包含的任何用户控件也是如此?

4

2 回答 2

1

如果AutoEventWireup为要加载的控件设置false为,则应重写该OnInit方法以连接Load控件的事件处理程序。和属性应该在 内部Request可用。ResponsePage_Load

例如:

public class Header : Control
{
    private void Page_Load(object sender, EventArgs e)
    {
    }

    override protected void OnInit(EventArgs e)
    {
        this.Load += new System.EventHandler(this.Page_Load);
    }   
}

有关更多信息,请参阅 MSDN :http AutoEventWireup: //support.microsoft.com/kb/324151

于 2013-01-17T04:46:33.717 回答
0

不幸的是,这是遗留代码,并不总是以正确的方式完成。

特别是,因为用户控件是手动加载和呈现的,它可能会跳过我想要利用的大部分事件模型。理想情况下,它应该对页面执行 AddControl(),而不是将控件呈现给 HtmlTextWriter。

我的解决方法是重写 RenderControl 方法,并browser在将 RenderControl 向上传递之前初始化属性。

于 2013-01-17T04:56:42.900 回答