我正在开发一个项目,其外部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
}
现在,这是我的问题:如果我在DoStuff()
Page_Load
中呼叫Outer
我希望它能够运行,请将foo
设置为列表并foo
不再是null
。然后,当任何内部控件的Page_Load
运行时,每个内部控件都可以访问foo
,而且不会是null
。
这不会发生。相反,在任何Page_Load
Inner1
,Inner2
或Inner3
中,当我访问foo
时,它始终是null
。但是,当页面在浏览器中加载时,Page_Load
Outer
完全执行,Page_Load
InnerX
加载,所以我对为什么{{感到困惑1}}当我调用内部控件的foo
时我再次null
,我知道它在外部控件(设置Page_Load
)之后运行。
如果我要从外部foo
移除DoStuff()
来电并进入每个内部Page_Load
,那么它可以正常工作。我想避免这种情况。
答案 0 :(得分:0)
在外部控件的Page_Load之前调用内部控件的Page_Load方法。但是你还有几个选择:
您可以使用延迟初始化,例如
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中创建List。