동적 웹 서버 컨트롤 및 뷰 상태

업데이트: 2007년 11월

웹 서버 컨트롤이 런타임에 동적으로 만들어지면 이 컨트롤에 대한 일부 정보는 페이지와 함께 렌더링된 뷰 상태에 저장됩니다. 그러나 페이지가 서버에 다시 게시되면 페이지에 정의된 비동적 컨트롤이 페이지의 Init 이벤트에서 인스턴스화되고, 동적 컨트롤을 다시 만들기 전에 일반적으로 Page_Load 처리기를 통해 뷰 상태 정보가 로드됩니다. 실제로 동적 컨트롤이 다시 만들어지기 전에 페이지의 컨트롤과 뷰 상태 간에 동기화가 일시적으로 해제됩니다. 남아 있는 뷰 상태 정보는 Page_Load 이벤트가 실행된 후 컨트롤 이벤트 처리 메서드가 호출되기 전에 동적 컨트롤에 로드됩니다.

대부분의 시나리오에서 이 뷰 상태 처리 모델은 제대로 작동합니다. 일반적으로 컨테이너의 컨트롤 컬렉션 끝에 동적 컨트롤을 추가합니다. 따라서 동적 컨트롤에 대해 저장된 뷰 상태 정보는 해당 컨테이너에 대한 뷰 상태 구조의 끝에 있는 추가 정보이고 페이지는 컨트롤이 만들어질 때까지 이 정보를 무시할 수 있습니다.

그러나 다음과 같은 두 시나리오에서는 동적으로 만들어진 컨트롤에 대한 뷰 상태 정보가 문제가 될 수 있습니다.

  • 기존 컨트롤 사이에 동적 컨트롤을 삽입하는 경우

  • 컨트롤을 동적으로 삽입한 다음 라운드트립 중에 다른 값을 사용하여 컨트롤을 다시 삽입하는 경우

기존 컨트롤 사이에 동적 컨트롤을 삽입하면 동적 컨트롤의 뷰 상태 정보가 뷰 상태 구조의 해당 위치에 삽입됩니다. 페이지가 게시되고 뷰 상태가 로드될 경우 동적 컨트롤이 아직 존재하지 않으므로 뷰 상태의 추가 정보가 해당 컨트롤과 일치하지 않습니다. 이런 경우 일반적으로 잘못된 캐스팅을 나타내는 오류가 발생합니다.

각 라운드트립 시 컨트롤을 다시 삽입하면 동적으로 만들어진 컨트롤이 생성될 때마다 이전 컨트롤 집합의 뷰 상태에서 속성 값이 선택됩니다. 대부분의 경우 컨테이너 컨트롤의 EnableViewState 속성을 false로 설정하여 이 문제를 방지할 수 있습니다. 이렇게 하면 동적 컨트롤에 대한 정보가 저장되지 않으며 이후 버전의 컨트롤과도 충돌하지 않습니다.

뷰 상태에 대한 자세한 내용은 다음 항목을 참조하십시오.

ASP.NET 페이지 수명 주기 개요

ASP.NET 상태 관리 개요ViewState

참고 항목

기타 리소스

프로그래밍 방식으로 ASP.NET 컨트롤 추가

프로그래밍 방식으로 ASP.NET 서버 컨트롤 속성 설정