1

私はOuter とUserControl呼ばれるアウターUserControlを持つプロジェクトに取り組んでおり、そのコードで静的にロードするインナーを決定するロジックを実行します。いくつかの内部コントロールがあり、それらをInner1Inner2、および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
}

さて、ここに私の問題があります。 ofを呼び出すDoStuff()と、実行されると予想され、リストに設定され、 ではなくなります。次に、内部コントロールのいずれかが実行されると、それらのそれぞれにアクセスできますが、アクセスできません。Page_LoadOuterfoofoonullPage_Loadfoonull

これは起こりません。代わりに、、、または--Page_Loadのいずれかで、アクセスすると常に. ただし、ページがブラウザーに読み込まれると、of が完全に実行されてからof が読み込まれるため、外側のコントロール ( を設定する) の後に実行されることがわかっている内側のコントロールを呼び出すと、なぜまた困惑します。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 に答える