수년간 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 이벤트는 순환 적으로 연결되지 않고 부모 이벤트를 독립적으로 실행하는 것으로 보이며 가장 안쪽 이벤트는 항상 먼저 실행됩니다. 그러나 반복적으로 단순히 체인으로 묶어 놓으면 인생이 훨씬 쉬워 질 것입니다. 그래서 주어진 상황에서 일을하기 전에 기본 이벤트를 호출 할 수도 있고하지 않을 수도 있습니다. 이 겉보기에 반 직관적 인 상황을 바람직하거나 필요로하는 부분이 없어지는 것이 있습니까?
기본 클래스가 자녀보다 먼저 초기화되기 때문에 동의합니다. –
질문에 대한 답변이 없지만 수명주기의이 단계에서 상위 또는 하위 컨테이너에 의존해서는 안된다는 지침이 있음을 알려드립니다. http://msdn.microsoft.com/en-us/library/system.web.ui.control.init.aspx –
이것은 웹 폼 아키텍처의 근본적인 디자인 결함이라고 생각합니다. 그래서 부모님과 자식 컨트롤 사이의 관계를 'OnLoad'라고 가정 할 때까지는 가정하지 않습니다. 그러나 동적으로 생성 된 컨트롤을 다시 작성하는 것처럼 OnLoad 전에 작업하는 것이 중요합니다 (OnInit에서 수행해야한다고 말함 : http://support.microsoft.com/kb/317794). 정보가 필요한 경우 어떻게해야합니까? 데이터 소스가 부모에 의해 결정되는 경우는 무엇입니까? –