Несмотря на многолетнюю работу с WebForms, я все еще время от времени путаюсь с жизненным циклом событий.Это не столько проблема, которую нужно решать, но и попытка лучше понять, почему все работает так, как они работают.
Предположим, у вас есть форма:
Default.aspx:
<form>
<MyControls:UserControl1 runat="server">
</form>
UserControl1: ascx:
<MyControls:UserControl2 runat="server">
События OnInit
происходят в следующем порядке:
UserControl2_OnInit
UserControl1_OnInit
Default_OnInit
Разве это не просто аккорды басов?Разве код Init не должен выполняться в порядке создания элементов управления?Разве родительский элемент управления не должен иметь возможность инициализировать свойства дочернего элемента до его запуска 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 не связаны рекурсивно, кажется, что они независимо запускают родительские события, и самое внутреннее всегда запускается первым.Но кажется, что жизнь была бы намного проще, если бы они были просто рекурсивно связаны, так что вы могли бы вызвать базовое событие (или нет), прежде чем делать свое дело в любой конкретной ситуации.Я что-то упускаю, что делает эту, казалось бы, нелогичную ситуацию желательной или даже необходимой?