2009-05-07 3 views
0

좋아, 이것은 내가 아침마다 문제를 겪고있는 정말 짜증나는 버그 다..net 페이지 이벤트 실행 순서 변경

나는 호출 페이지 onload에 의해 설정되고 Viewstate에 저장되는 속성을 가진 많은 프로젝트에서 사용하는 사용자 지정 컨트롤이 있습니다. 컨트롤은 사용자 지정 컨트롤의 CreateChildControls() 메서드에서 속성을 사용하여 하위 컨트롤을 설정합니다.

일반적으로 포스트 백에서 Page_Load 이벤트가 발생하면 페이지 컨트롤의 CreateChildControls 메서드가 실행됩니다.

사이트에 로그인 시스템 (사용자 지정 멤버 자격 공급자)이 있고 사용자가 로그인하면 CreateChildControls() 메서드가 먼저 발생하여 Page_Load가 발생하여 컨트롤 속성이 잘못 설정됩니다 이전 게시물에서)

어떻게 다른 순서로 이벤트를 실행할 수 있습니까? 모든 페이지 이벤트가 무엇이든지 상관없이 같은 순서로 발생했다고 생각했는데 로그인 한 상태가 어떻게 변경되는지 알지 못합니다.

업데이트 : 내가 EnsureChildControls()를 호출하지 않아 문제가있는 것 같지만 어디에서 호출해야하는지 모르겠습니다. EnsureChildControls()를 호출해야 할 때 자식 컨트롤을 설정하는 데 사용되는 컨트롤에 몇 가지 속성이 설정되면 EnsureChildControls()가 수행하는 작업을 완전히 이해하지 못했을 것입니다.

답변

4

CreateChildControls는 ASP.NET 페이지에 필요할 때마다 호출됩니다. 페이지주기에는 특별한 점이 없습니다. Init 이벤트에서 발생할 수 있으며 Load 이벤트에서 발생할 수 있습니다. 자식 컨트롤을 사용할 수 있는지 확인하려면 컨트롤의 EnsureChildControls() 메서드를 호출합니다. 컨트롤의 Init 이벤트에서이 작업을 수행하여 전체 수명주기 동안 하위 컨트롤이 있는지 확인하거나 하위 컨트롤 중 하나 (예 : 하위 컨트롤)에 대한 참조가 필요할 때마다 할 수 있습니다. 귀하의 통제 재산의 취득자/세터에

+0

OK EnsureChildControls()를 어디에서 호출해야하는지 명확하지 않습니다. 문제는 페이지로드 이벤트에 속성이 설정되어 있지만 이전의 포스트 백에서 속성 값을 사용하여 팝업에서 CreateChildControls()가 이미 호출 된 경우 사용되지 않습니다. EnsureChildControls()를 호출해야하는시기는 무엇입니까? – Sheff

1

다음 내가 사용 포함 된 자식 컨트롤에 액세스해야하는 서버/사용자 컨트롤의 속성을 만들 때 :

public Whatever SomeProperty 
{ 

    get 
    { 
     EnsureChildControls(); 
     <more code here> 
    } 
    set 
    { 
     EnsureChildControls(); 
     <more code here> 
    } 
} 

이는 제어 소비자가 페이지의 여러 단계에서 컨트롤 작업을 자유롭게 보장을 수명주기.

+1

확인 생각했지만 추가 할 때 몇 가지 문제가 발생했습니다. CreateChildControls를 호출하기 전에 몇 가지 속성이 필요하므로 각 속성에 논리를 추가하여 EnsureChildControls를 추가하면 포스트 백에서 다음 예외가 발생합니다. 실패 viewstate가로드되는 컨트롤 트리가 이전 요청 동안 viewstate를 저장하는 데 사용 된 컨트롤 트리와 일치해야합니다. propertys가 설정되기 전에 CreateChildControls가 이미 호출되었으므로 의미가 있습니다. n 포스트 백 – Sheff