1

我正在开发一个项目,该项目有一个UserControl名为Outer的外部,它执行一些逻辑来确定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
}

现在,这是我的问题:如果我调用我希望它运行的,设置DoStuff()为一个列表并变为不再。然后,当任何内部控件运行时,每个控件都可以访问,但不会。Page_LoadOuterfoofoonullPage_Loadfoonull

这不会发生。相反,在任何,Page_Load或--当我访问它时总是. 然而,当页面在浏览器中加载时,完全执行,然后加载,所以我很困惑为什么当我调用我知道在外部控件(设置)之后运行的内部控件时再次出现。Inner1Inner2Inner3foonullPage_LoadOuterPage_LoadInnerXfoonullPage_Loadfoo

如果我DoStuff()要从外部删除呼叫Page_Load并进入每个单独的内部Page_Load,它工作正常。我想避免这种情况。

4

1 回答 1

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 中创建列表。

于 2013-01-09T20:35:39.523 回答