2009-10-09 2 views
0

ASP.Net 페이지에 ajax 툴킷 탭 컨테이너가 있으며 런타임에 코드의 탭을 동적으로 생성하고 있습니다. 탭, 레이아웃은 같지만 헤더 텍스트와 본문 데이터가 다릅니다). 각 탭에는 하나의 컨트롤 만 포함되어 있습니다.이 컨트롤은 모든 탭을 똑같이 보이도록 만들었습니다. 사용자 정의 컨트롤에서 탭 내 데이터의 페이징을 처리하기 위해 작성한 또 다른 사용자 정의 컨트롤입니다. 페이징 사용자 정의 컨트롤에는 ViewState가 지원되는 속성이 있습니다.동적으로 생성 된 ASP.Net 컨트롤의 viewstate를 다시로드하는 중 문제가 발생했습니다.

ASPX 페이지의 단일 BindData 함수에서 탭에 대한 모든 데이터를 바인딩합니다. 이 함수 내에서 동적으로 생성 된 컨트롤의 ID를 설정하고 다른 속성을 설정하거나 이벤트를 연결하거나 데이터를 바인딩하기 전에 해당 컨트롤을 컨테이너 컨트롤에 추가합니다.

나는이 시나리오에서 내 페이징 사용자 컨트롤에서의 ViewState 변수의 값을 잃는 오전 :

주요 ASPX 페이지

Page_Init: 

    If IsPostBack Then 
     BindData  ' Recreates the control tree on postback. 
     ' ViewState is loaded successfully here. 
    End If 

Page_Load: 

    If Not IsPostBack Then 
     BindData() ' Bind the initial data. 
    End If 

[Some event that happens after Page_Load in response to clicking on my user control]: 

    ... 
    BindData() ' Controls recreated with changed data but same IDs as in Page_Init. 
    ' ViewState does not get loaded back into my control tree. 

내가하지 viewstate가가의 두 번째 버전에 다시로드받을 것으로 예상해야 내 페이지 수명주기의 컨트롤 트리?

답변

2

많은 내용을 읽은 후 Init 단계 후에 생성 된 동적 컨트롤은 ViewState를로드하지 않습니다. 필자의 상황에서는 BindData 함수에서 viewstate 값을 로컬 변수로 가져 와서 컨트롤을 다시 만든 다음 viewstate 값을 다시 설정합니다. 이것은 작동하는 것 같습니다.

+0

작성 코드를 제어 전 (pre-init)에 연결하려고 했습니까? JUst를 사용하여 viewstate의 값을 수동으로 재 할당하려는 노력을 줄일 수 있는지 확인하십시오. 비록 당신이 이미 그것을 만들었지 만 :) –

+0

문제는 ASP.NET 내에서 한 번 바인드하자마자 뷰 상태를 잊었습니다. 이것은 init 후에로드가 발생하기 전에 발생합니다. 똑같은 컨트롤 트리를 다시 만들더라도 동일한 요청 중에 뷰 상태를 두 번 바인딩 할 수 없습니다. Annyoing, 네! –

0

사전 조정 단계에서 동적 컨트롤을 만들어야합니다. 다시 게시 한 후에도 다시 생성하십시오. 여기에서 페이지 수명주기의 세부 사항을 확인하십시오 : http://msdn.microsoft.com/en-us/library/ms178472.aspx

+0

초기화 단계에서 동적 컨트롤을 다시 만듭니다. (기사를 확인한 후 ViewState 로딩은 Init 이후에 발생하므로 동적 컨트롤이 PreInit 또는 Init에서 작성되었는지 여부는 중요하지 않음), 포스트 백 이후 . 이 모든 것이 잘 작동합니다. 컨트롤 이벤트 핸들러가 실행 된 후 컨트롤을 다시 만들면 ViewState가 손실됩니다. –

관련 문제