父UserControls和内部UserControls之间的方法顺序
本文关键字:UserControls 方法 顺序 内部 之间 | 更新日期: 2023-09-27 17:51:18
我正在处理一个项目,该项目有一个名为outer的外部UserControl
,它执行一些逻辑来确定在其代码中静态加载哪个内部UserControl
。有几个内部控件,我们将其称为Inner1、Inner2和Inner3。
所有内部控件都继承外部控件,因此:
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
}
现在,我的问题是:如果我在Outer
的Page_Load
中调用DoStuff()
,我希望它运行,将foo
设置为列表,foo
将不再是null
。然后,当任何内部控件的Page_Load
运行时,这些控件中的每一个都可以访问foo
,而它将不是null
。
这种情况不会发生。相反,在Inner1
、Inner2
或Inner3
中的任何Page_Load
中——当我访问foo
时,它总是null
。然而,当页面在浏览器中加载时,Outer
的Page_Load
完全执行,然后InnerX
的Page_Load
加载,所以当我调用内部控件的Page_Load
时,我很困惑为什么foo
又是null
,我知道它在外部控件(设置foo
(之后运行。
如果我将DoStuff()
调用从外部Page_Load
中移除,并移入每个单独的内部Page_Load
中,它可以正常工作。不过我想避免这种情况。
内部控件的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中创建列表。