참조
https://learn.microsoft.com/en-us/previous-versions/aspnet/bb386448(v=vs.100)
View State
- 라운드 트립 동안 페이지/컨트롤의 상태를 유지하는 역할
※ 라운드 트립 (Round Trip)
- 클라이언트와 서버 간의 상호작용을 설명하는 용어
1. 클라이언트가 특정 작업을 수행하고 서버에 요청을 보냄
2. 서버가 요청을 처리하고, 필요한 데이터를 생성하거나 상태를 변경함
3. 서버가 처리 결과를 클라이언트에게 반환함
4. 클라이언트가 서버의 응답을 받아 화면에 표시함
등장 배경
- 웹 애플리케이션은 기본적으로 Stateless
: 서버에 요청이 있을 때마다 새로운 인스턴스가 생성되며, 요청 전 상태는 모두 초기화됨
ex) 사용자가 TextBox에 데이터를 입력해 서버로 전송하더라도, 응답으로 돌아오는 페이지에서는 그 데이터가 사라짐
→ 이전 요청에서 사용했던 데이터를 다른 요청에서 사용할 수 없음
→ 이러한 특성을 극복하기 위해, ASP.NET에서는 '상태 관리'를 통해 페이지/컨트롤 값이 유지되도록 함
→ 그 중 하나가 'View State'
특징
1) 세션이나 사용자 프로필에 값을 저장하지 않고도 Postback 간에 값을 유지할 수 있음
- 페이지를 다시 로드하더라도 사용자가 입력한 데이터가 사라지지 않음
2) 페이지 및 컨트롤 속성 값 저장
- 페이지를 다시 로드할 때에도 CheckBox나 SelectBox의 선택 값을 유지할 수 있음
3) DB에 View State를 저장할 수 있는 Custom View State Provider를 만들 수 있음
4) 개별 페이지 내에서만 상태 정보를 유지할 수 있음
i. A 페이지에서 A 페이지로 요청을 다시 보낼 경우 (Postback) : 가능
ii. A 페이지에서 B 페이지로 요청을 보낼 경우 : 불가능
· View State는 A 페이지에서만 적용되므로, B 페이지에서는 A 페이지의 상태 정보를 사용할 수 없음
· 이 경우에는 세션, 쿠키, 쿼리 스트링 등 다른 방법을 사용해야 함
5) 모든 컨트롤의 정보를 저장할 필요가 없다면, 특정 컨트롤에 대해 View Statae를 비활성화할 수 있음
기본 동작
- 페이지의 HTML이 렌더링될 때, 페이지의 현재 상태와 Postback 동안 유지해야 할 값들이 Base64 방식으로
인코딩되어 문자열로 직렬화됨
→ 이렇게 직렬화된 문자열은 기본적으로는 페이지 내 hidden input에 저장됨 (저장 위치 변경 가능)
→ 페이지가 다시 Postback될 때 이 데이터를 전송함
※ 이러한 과정 때문에 페이지 성능에 나쁜 영향을 줄 수 있음
※ hidden input을 허용하지 않는 일부 기기에서는 View State가 작동하지 않을 수 있음
- hidden input으로 전송되기 때문에 페이지의 PreRenderComplete 이벤트가 발생할 때까지 View State를 변경할 수 있음
→ 페이지가 렌더링된 후에는 변경 사항이 저장되지 않음
- 개발자는 페이지의 ViewState 속성을 통해 데이터에 접근할 수 있음 (Dictionary 타입)
※ ViewState 속성을 사용하려면 페이지에 runat="server" 특성을 갖는 form 요소가 존재해야 함
ViewState 속성에 저장 가능한 데이터 타입
1) String
2) int
3) Boolean
4) Array
5) ArrayList
6) Hash Tables
7) 직렬화 가능한 사용자 정의 클래스
[Serializable] // 직렬화 가능하도록 함
public class CustomObject
{
public string Name { get; set; }
public int Age { get; set; }
}
// ViewState에 CustomObject 저장
CustomObject myObject = new CustomObject { Name = "Alice", Age = 30 };
ViewState["MyObject"] = myObject;
ViewState 속성에서 값 가져오기
ArrayList arrayList = new ArrayList(); // 빈 ArrayList 생성
arrayList = (ArrayList)ViewState["arrayListInViewState"]; // ViewState에서 ArrayList 가져오기
this.GridView1.DataSource = arrayList; // GridView의 데이터 소스로 설정
this.GridView1.DataBind(); // 데이터 바인딩
- ViewState의 값은 항상 문자열로 저장되기 때문에, 반드시 형 변환 작업을 거쳐야 함
- 해당 key에 대한 값이 존재하지 않는다면 null 값을 반환함
※ 존재하지 않는 항목을 사용하려고 하면 NullReferenceException 예외 발생
'C#' 카테고리의 다른 글
[C#/dotnet] 라우팅 (Routing) (4) | 2024.10.25 |
---|---|
[C#/dotnet] 서버 컨트롤 (0) | 2024.10.24 |
[C#/dotnet] 페이지 구조 - 마스터 페이지 & 콘텐츠 페이지 (1) | 2024.10.24 |
[C#/dotnet] 페이지 수명 주기 (3) | 2024.10.24 |
[C#/dotnet] 제네릭 (Generics) (0) | 2024.10.23 |