父和内部用户控件之间的方法顺序

时间:2013-01-09 20:31:26

标签: c# asp.net inheritance webforms page-lifecycle

我正在开发一个项目,其外部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 Inner1Inner2Inner3中,当我访问foo时,它始终是null。但是,当页面在浏览器中加载时,Page_Load Outer完全执行,Page_Load InnerX加载,所以我对为什么{{感到困惑1}}当我调用内部控件的foo时我再次null,我知道它在外部控件(设置Page_Load)之后运行。

如果我要从外部foo移除DoStuff()来电并进入每个内部Page_Load,那么它可以正常工作。我想避免这种情况。

1 个答案:

答案 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。