【问题标题】:User control instances are null while using nested master page使用嵌套母版页时,用户控件实例为空
【发布时间】:2011-08-04 08:40:56
【问题描述】:

我有几个在 aspx 中静态引用的用户控件。我们在 Page_Preinit 事件中设置用户控件的一些公共属性。 该页面还引用了母版页

到目前为止一切正常。不得不重新设计 ui,我们实现了嵌套母版页。

现在,突然之间,用户控件显示为空。如果我将母版页更改为父页(而不是子嵌套),它可以正常工作。

感谢任何指向此问题的指针。

一些示例代码:这里 ucAddress 为空

protected void Page_PreInit(object sender, EventArgs e) { ucAddress.City = "Dallas"; }

【问题讨论】:

  • 发现问题。在访问用户控件之前必须初始化子母版页。 MasterPage master = (MasterPage)this.Master.Master;
  • 我遇到了同样的问题,我希望你提供一个完整的答案,我可以从中学习。

标签: asp.net master-pages


【解决方案1】:

blog post 这个blog post 很好地描述了这个问题,也提供了一个解决方案。我可以确认该解决方案有效,我将在此处重复相关部分:

问题

我们有一个用户控件,并在Init 事件中初始化它的控件,以便在ViewState 恢复时(在InitLoad 之间)准备好。

一旦您开始使用这种封装技术,您很快就会想要传入一个影响您加载的数据的参数。在我们这样做之前,我们需要知道Init 事件是以相反的顺序触发的。也就是说,子控件在父控件触发该事件之前触发其Init 事件。因此,Page.Init 事件为时已晚,我们无法在控件上设置任何属性。

自然的解决方案是尝试使用Page.PreInit 事件,但是当您这样做时,您通常会发现您的控件引用都是null。当您的页面使用母版页实现时会发生这种情况,它与母版页的实现方式有关。母版页中的<asp:ContentPlaceHolder /> 控件使用ITemplate 接口来构建其内容。在调用Init 事件之前,通常不会准备此内容(子控件),这意味着控件引用不可用。对我们来说,这是一个问题。

解决方案

修复非常简单;我们需要做的就是触摸Page 上的Master 属性,它将导致控件可用。如果我们使用嵌套母版页,我们需要接触链中的每个母版页。

博文的作者随后提供了一个不错的小 sn-p,您可以在 PagePreInit 处理程序中执行它,该处理程序使用 MasterPage 并包含用户控件:

protected override void OnPreInit(EventArgs e)
{
    // Walk up the master page chain and tickle the getter on each one
    MasterPage master = this.Master;
    while( master != null ) master = master.Master;
    
    // Access now initialized user control
    ucAddress.City = "Dallas";
}

【讨论】:

  • 感谢您提供此解决方案。它像魔术一样工作。我发现自己不得不经常使用 Web 表单来解决问题。希望学习一种更现代的工具,希望不会那么不方便。
【解决方案2】:

发现问题。在访问用户控件之前必须初始化子母版页。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-25
    • 2010-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 2023-04-02
    相关资源
    最近更新 更多