我有几个在aspx中静态引用的用户控件。我们在Page_Preinit事件中为用户控件设置了一些公共属性。 该页面还引用了母版页
到目前为止工作正常。不得不进行ui重新设计,我们实现了嵌套的母版页。
现在,突然之间,用户控件显示为null。如果我将母版页更改为父版(而不是子版),则可以正常工作。
感谢任何指向此问题的指示。
一些示例代码:此处ucAddress为null
protected void Page_PreInit(object sender, EventArgs e) { ucAddress.City = "Dallas"; }
答案 0 :(得分:0)
这个blog post很好地描述了这个问题,并提供了一个解决方案。我可以确认解决方案有效,我将在此重复相关部分:
问题
我们有一个用户控件并在Init
事件中初始化其控件,以便在ViewState
恢复后(Init
和Load
之间)准备就绪。< / 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)
发现了这个问题。必须在访问用户控件之前初始化子母版页。