【问题标题】:Propagation of events to User Controls in ASP.NET将事件传播到 ASP.NET 中的用户控件
【发布时间】:2012-12-31 14:01:20
【问题描述】:

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

用户控件、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) 方法中使用该语句,但这似乎没有触发,即使我在 Navigation 构造函数中有 this.Load += new System.EventHandler(this.Page_Load);

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

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

【问题讨论】:

  • 从哪里调用layoutAndRender 方法?
  • 它是从控制类标准中调用的。不幸的是,这是遗留代码,并不总是以正确的方式完成。
  • 你能说得更具体些吗? layoutAndRender 是在 StandardPage_Load 方法中调用的,还是从其他地方调用的,比如 Render 方法?
  • layoutAndRender 是从 Standard::Render 调用的。 Standard 扩展 System.Web.UI.Control。我可以看到它是这样做的。因为在多个layoutAndRender 调用中间是一个base.Render() 启用布局。

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


【解决方案1】:

如果您要加载的控件的AutoEventWireup 设置为false,那么您应该重写OnInit 方法来连接控件的Load 事件处理程序。 RequestResponse 属性应该在 Page_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);
    }   
}

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

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 2011-08-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多