2010-03-11 4 views
2

원래의 이해로 asp.net 페이지 수명주기는 정상적인 상황에서 모든 페이지와 컨트롤에 대해 한 번 실행됩니다. 컨테이너의 OnPreRender 중에 컨트롤을 연결하면 컨트롤의 OnInit이 호출되지 않은 상황이 발생했습니다. 좋습니다, 나는 그 코드를 버그로 생각하고 컨트롤을 일찍 붙이는 것으로 고정 시켰습니다.부모의 OnPreRender 중에 컨트롤을 연결하는 경우에도 OnInit 컨트롤이 호출됩니까?

하지만 지금은 정상적인 OnInit이 다른 모든 사람들을 위해 수행 된 후에 컨트롤에 대한 OnInit이 호출 된 것처럼 보입니다. 아래 스택을 참조하십시오. 페이지의 PreRender 동안 동적으로 추가되는 컨트롤의 OnInit가 호출되는 것 같습니다.

그래서 ASP.NET의 동작이 정확히 무엇인지 확인하고 싶습니다. 실제로 각 컨트롤의 수명주기를 추적하고 새로운 컨트롤을 추가하면 처음부터 실행됩니까?

[HttpException (0X80004005). 제어 데이터 바인딩 컬렉션, 초기화,로드, 사전 렌더링 단계 동안 수정되거나 언로드 될 수 없다] System.Web.UI.ControlCollection.Add (컨트롤 자식) 8,678,663 MyCompany.Web. 컨트롤 이름 지정 컨테이너 (Control namingContainer) +333 System.Web.UI.Control.InitRecursive (Control namingContainer) +210 System.Web.UI.Control.AddedControl (컨트롤 컨트롤, Int32 인덱스) +198 System.Web.UI.ControlCollection.Add (컨트롤 자식) +80 MyCompany.Web.Controls.PageHeader.OnPreRender (EventArgs 이자형) System.Web.UI.Control.PreRenderRecursiveInternal() +80 System.Web.UI.Control.PreRenderRecursiveInternal() 171 System.Web.UI.Control.PreRenderRecursiveInternal()에서 171 System.Web.UI .Page.ProcessRequestMain (부울 includeStagesBeforeAsyncPoint, 부울 includeStagesAfterAsyncPoint) +842

답변

4

컨트롤의 OnInit은 컨트롤 트리에 추가 되 자마자 호출됩니다. 당신의 스택에 당신이 이런 일을 볼 수 있습니다,이 문제가 발생 : 다음은 트리거

System.Web.UI.Control.AddedControl(Control control, Int32 index) +198 
System.Web.UI.ControlCollection.Add(Control child) +80 

을 :

MyCompany.Web.Controls.SetStartPageWrapper.OnInit(EventArgs e) 

을 그래서 추가되는 수명주기의 어떤 시점에서, 그것은 개막하는 OnInit입니다.

Egghead has a good image depicting normal event lifecycles between pages and controls하지만 이벤트가 아직 존재하지 않는다면 어떤 이벤트가 실행되지 않을 수 있습니다 ... 방금 추가 된 이벤트는 이벤트가 발생했을 때가 아니라 그 시점의 이벤트를 따라 잡아야합니다. 컨트롤이 마크 업 중이거나 CreateChildControls 인 경우에 발생합니다.

+0

뿐만 아니라 Load와 같은 다른 컨트롤 이벤트가 발생하여 컨트롤이 나머지 컨트롤 트리가 수명주기에있는 부분을 "따라 잡을"수 있습니다. –

+0

@William - 좋은 점은 주석을 쓰는 동안 설명 할 이미지를 찾는 것입니다. –

+0

올바른지, 각 컨트롤은 연결 한 후 라이프 사이클에서 새 부모의 현재 상태를 "따라 잡습니다". 리플렉터 코드 : 보호 내부 가상 공극 AddedControl (컨트롤 제어, 지능 지수) ... 경우 (this._controlState> = ControlState.ChildrenInitialized) { control.InitRecursive 각 컨트롤이 트랙 전용 변수 _controlState을 갖는다 (namingContainer); ... – Xerion

관련 문제