Почему субэлементы управления инициализируются до своих контейнеров?

Несмотря на то, что я много лет работал с WebForms, я все еще время от времени запутался в жизненном цикле событий. Это не столько проблема, которую нужно решить, сколько надежда лучше понять, почему все работает именно так.

Предположим, у вас есть форма:

Default.aspx:

<form>
  <MyControls:UserControl1 runat="server">
</form>

UserControl1: ascx :

<MyControls:UserControl2 runat="server">

События OnInit происходят в таком порядке:

UserControl2_OnInit
UserControl1_OnInit
Default_OnInit

Разве это не просто бас? Разве код инициализации не следует запускать в порядке создания элементов управления? Разве родительский элемент управления не должен иметь возможность инициализировать свойства дочернего элемента перед запуском его OnInit? То есть, хотя вы можете инициализировать свойства субэлементов управления в разметке, там ' Нет прямого способа, чтобы родительский элемент управления мог динамически устанавливать свойства дочернего элемента управления, которые будут доступны его событию OnInit.

В итоге я сделал что-то вроде этого:

override void UserControl2_OnInit()
{
    NamingContainer.OnInit += new EvenHandler(UserControl1_ActualInit);
}
protected void UserControl2_ActualInit(..) {
  // do actual init code here, which will occur before OnLoad but after it's parent
  // OnInit
}

Так что это не непреодолимая проблема. Я просто не понимаю, почему это вообще проблема.

Я понимаю, что, возможно, вы захотите иметь возможность инициализировать все дочерние элементы управления в коде OnInit. Итак, вы должны иметь возможность сначала вызвать base.OnInit, а не после, ваш собственный код инициализации, который должен вызвать запуск всех событий дочернего элемента управления OnInit. Но жизненный цикл события так не работает. События Init не связаны рекурсивно, кажется, что они запускают родительские события независимо, а самое внутреннее всегда запускается первым. Но, похоже, жизнь была бы намного проще, если бы они были просто рекурсивно связаны цепочкой, чтобы вы могли либо вызвать базовое событие (или нет), прежде чем делать свое дело в любой данной ситуации. Что-то мне не хватает, что делает эту, казалось бы, нелогичную ситуацию желательной или даже необходимой?

5
задан Jamie Treworgy 9 February 2011 в 13:53
поделиться