동적 웹 서버 컨트롤 및 뷰 상태
업데이트: 2007년 11월
웹 서버 컨트롤이 런타임에 동적으로 만들어지면 이 컨트롤에 대한 일부 정보는 페이지와 함께 렌더링된 뷰 상태에 저장됩니다. 그러나 페이지가 서버에 다시 게시되면 페이지에 정의된 비동적 컨트롤이 페이지의 Init 이벤트에서 인스턴스화되고, 동적 컨트롤을 다시 만들기 전에 일반적으로 Page_Load 처리기를 통해 뷰 상태 정보가 로드됩니다. 실제로 동적 컨트롤이 다시 만들어지기 전에 페이지의 컨트롤과 뷰 상태 간에 동기화가 일시적으로 해제됩니다. 남아 있는 뷰 상태 정보는 Page_Load 이벤트가 실행된 후 컨트롤 이벤트 처리 메서드가 호출되기 전에 동적 컨트롤에 로드됩니다.
대부분의 시나리오에서 이 뷰 상태 처리 모델은 제대로 작동합니다. 일반적으로 컨테이너의 컨트롤 컬렉션 끝에 동적 컨트롤을 추가합니다. 따라서 동적 컨트롤에 대해 저장된 뷰 상태 정보는 해당 컨테이너에 대한 뷰 상태 구조의 끝에 있는 추가 정보이고 페이지는 컨트롤이 만들어질 때까지 이 정보를 무시할 수 있습니다.
그러나 다음과 같은 두 시나리오에서는 동적으로 만들어진 컨트롤에 대한 뷰 상태 정보가 문제가 될 수 있습니다.
기존 컨트롤 사이에 동적 컨트롤을 삽입하는 경우
컨트롤을 동적으로 삽입한 다음 라운드트립 중에 다른 값을 사용하여 컨트롤을 다시 삽입하는 경우
기존 컨트롤 사이에 동적 컨트롤을 삽입하면 동적 컨트롤의 뷰 상태 정보가 뷰 상태 구조의 해당 위치에 삽입됩니다. 페이지가 게시되고 뷰 상태가 로드될 경우 동적 컨트롤이 아직 존재하지 않으므로 뷰 상태의 추가 정보가 해당 컨트롤과 일치하지 않습니다. 이런 경우 일반적으로 잘못된 캐스팅을 나타내는 오류가 발생합니다.
각 라운드트립 시 컨트롤을 다시 삽입하면 동적으로 만들어진 컨트롤이 생성될 때마다 이전 컨트롤 집합의 뷰 상태에서 속성 값이 선택됩니다. 대부분의 경우 컨테이너 컨트롤의 EnableViewState 속성을 false로 설정하여 이 문제를 방지할 수 있습니다. 이렇게 하면 동적 컨트롤에 대한 정보가 저장되지 않으며 이후 버전의 컨트롤과도 충돌하지 않습니다.
뷰 상태에 대한 자세한 내용은 다음 항목을 참조하십시오.