使用嵌套母版页时,用户控件实例为null

时间:2011-08-04 08:40:57

标签: asp.net master-pages

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

到目前为止工作正常。不得不进行ui重新设计,我们实现了嵌套的母版页。

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

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

一些示例代码:此处ucAddress为null

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

2 个答案:

答案 0 :(得分:0)

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

问题

我们有一个用户控件并在Init事件中初始化其控件,以便在ViewState恢复后(InitLoad之间)准备就绪。< / p>

  

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

     

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

解决方案

  

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

博客文章的作者提供了一个很好的小片段,您可以在PreInit使用Page并包含用户控件的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";
}

答案 1 :(得分:-1)

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