父UserControls和内部UserControls之间的方法顺序

本文关键字:UserControls 方法 顺序 内部 之间 | 更新日期: 2023-09-27 17:51:18

我正在处理一个项目,该项目有一个名为outer的外部UserControl,它执行一些逻辑来确定在其代码中静态加载哪个内部UserControl。有几个内部控件,我们将其称为Inner1Inner2Inner3

所有内部控件都继承外部控件,因此:

Outer : System.Web.UI.UserControl

Inner1 : Outer

Inner2 : Outer

Inner3 : Outer

Outer.cs中,我有一些内部控制访问的字段和方法,例如

List<string> foo = null;
protected void Page_Load(object sender, EventArgs e)
{
    
}
public void DoStuff()
{
    foo = MethodToPopulateFoo(); // this always works and returns a List<string> even if its empty
    // other stuff here
}

现在,我的问题是:如果我在OuterPage_Load中调用DoStuff(),我希望它运行,将foo设置为列表,foo将不再是null。然后,当任何内部控件的Page_Load运行时,这些控件中的每一个都可以访问foo,而它将不是null

这种情况不会发生。相反,在Inner1Inner2Inner3中的任何Page_Load中——当我访问foo时,它总是null。然而,当页面在浏览器中加载时,OuterPage_Load完全执行,然后InnerXPage_Load加载,所以当我调用内部控件的Page_Load时,我很困惑为什么foo又是null,我知道它在外部控件(设置foo(之后运行。

如果我将DoStuff()调用从外部Page_Load中移除,并移入每个单独的内部Page_Load中,它可以正常工作。不过我想避免这种情况。

父UserControls和内部UserControls之间的方法顺序

内部控件的Page_Load方法在外部控件的Page_Load之前调用。但你仍然有几个选择:

您可以使用Lazy初始化,例如

List<string> _foo;
List<string> Foo
{
   get 
   {
      if (_foo == null)
         _foo = new List<string>();
      return _foo;
   }
}

或者在外部控件中初始化foo(每个类都应该初始化它自己的对象(,并不是从Page_Load访问它,而是从内部控件中的Page_PreRender访问它。您也可以在Page_Init或Page_PreLoad中创建列表。