뷰 상태 제어
업데이트: 2007년 11월
Microsoft ASP.NET 웹 페이지는 라운드트립 중에 자신의 상태를 유지할 수 있습니다. 컨트롤에 대한 속성이 설정되는 경우 ASP.NET은 컨트롤 상태의 일부로 속성 값을 저장합니다. 응용 프로그램에게 이것은 페이지의 수명이 여러 클라이언트 요청에 걸쳐 있는 것으로 보이게 됩니다. 이 페이지 수준 상태를 페이지의 뷰 상태라고 합니다.
일반적인 ASP.NET 웹 페이지의 경우, 서버가 클라이언트에 대한 응답의 일부로서 뷰 상태를 폼의 숨김 필드로 보내고 클라이언트는 다시 게시의 일부로서 뷰 상태를 서버로 반환합니다. 그러나 모바일 컨트롤을 사용하는 경우 대역폭 요구를 줄이기 위해 ASP.NET은 페이지의 뷰 상태를 클라이언트로 보내지 않습니다. 대신, 뷰 상태는 사용자 세션의 일부로 서버에 저장됩니다. 뷰 상태가 있는 경우, ASP.NET은 클라이언트에 대한 각 응답의 일부로서 해당 페이지의 뷰 상태를 식별하는 숨김 필드를 보내고 클라이언트는 다음 다시 게시의 일부로서 숨김 필드를 서버로 반환합니다.
뷰 상태 기록 관리
특정 페이지의 뷰 상태는 서버에 보관되어야 하기 때문에 사용자가 브라우저의 뒤로 단추를 클릭하면 서버의 현재 상태와 브라우저의 현재 페이지 간에 동기화 상태가 유지되지 않을 수 있습니다. 예를 들어, 사용자가 페이지 1로 이동하고 단추를 눌러 페이지 2로 이동한 다음 뒤로를 눌러 페이지 1로 되돌아온 경우 브라우저의 현재 페이지는 페이지 1이지만 서버에서 현재 상태는 페이지 2입니다.
이 문제를 처리하기 위해 ASP.NET 모바일 웹 페이지는 사용자의 세션에 뷰 상태 정보의 기록을 유지합니다. 클라이언트로 전달되는 각 식별자는 이 기록 내의 위치에 해당합니다. 앞의 예에서 사용자가 페이지 1에서 다시 게시하면 모바일 웹 페이지는 페이지 1에 저장된 식별자를 사용하여 뷰 상태 기록을 동기화합니다.
이 기록의 크기를 응용 프로그램에 맞게 구성할 수 있습니다. 기본 크기는 6이며, 다음 예제처럼 Web.config 파일의 태그에 숫자 특성을 추가하여 크기를 변경할 수 있습니다.
<configuration>
<system.web>
<mobileControls sessionStateHistorySize="10" />
</system.web>
</configuration>
만료된 세션 관리
뷰 상태가 사용자 세션에 저장되므로 페이지가 세션 만료 시간 안에 다시 게시되지 않으면 뷰 상태가 만료될 수 있습니다. 이러한 만료는 모바일 웹 페이지에만 해당됩니다. 뷰 상태가 없는 페이지를 사용자가 다시 게시하면 페이지의 OnViewStateExpire 메서드가 호출됩니다. 이 메서드의 기본 구현은 뷰 상태가 만료되었음을 나타내는 예외를 throw합니다. 그러나 만료된 후 응용 프로그램에서 뷰 상태를 수동으로 복원할 수 있으면 페이지 수준에서 이 메서드를 재정의하고 기본 구현을 호출하지 않을 수 있습니다.
뷰 상태 활성화 및 비활성화
세션을 사용하여 뷰 상태를 관리하면 응답 크기가 작아진다는 장점이 있는 반면, 세션 상태의 비효율적인 사용으로 인해 성능이 저하될 수 있다는 단점도 있습니다. 많은 양의 데이터가 있는 컨트롤을 사용하는 경우 사용자 지정 페이징이나 뷰 상태 비활성화와 같은 방법을 사용하여 효율성을 높일 수 있습니다. 예를 들어, 뉴스 기사를 표시하는 사이트의 경우 각 사용자 세션에 기사 내용을 저장하는 대신 사이트에서 보다 지능적인 데이터 액세스를 사용하여 각 기사의 복사본 하나만 서버에 캐시되도록 하고 세션 상태 사용을 최소화할 수 있습니다.
컨트롤과 그 자식에 대한 뷰 상태를 비활성화하려면 컨트롤의 EnableViewState 속성을 false로 설정합니다. 페이지 전체의 뷰 상태를 비활성화하려면 @ Page 지시문의 EnableViewState 특성을 false로 설정합니다.
뷰 상태가 비활성화된 경우에도 일부 모바일 컨트롤은 클라이언트 라운드트립 중에 필수 상태 정보를 저장합니다. 이러한 정보에는 페이지에서 현재 활성화된 폼 등이 있습니다. 뷰 상태를 비활성화하면 페이지는 이 필수 정보를 클라이언트로의 라운드트립 중에 전달되는 숨겨진 폼 변수로 저장합니다.
쿠키 및 클라이언트 상태 관리
기본적으로 ASP.NET의 세션 관리 기능에서는 서버가 세션 쿠키를 클라이언트에 기록합니다. 이후 클라이언트는 세션 중의 각 요청에 대해 쿠키를 제출하고 서버는 쿠키 정보를 사용하여 세션 상태 정보를 찾습니다. 그러나 많은 모바일 장치가 쿠키를 지원하지 않습니다. 뷰 상태를 비롯한 세션 관리가 이러한 장치에서 제대로 작동하려면 쿠키 없이 세션 관리를 사용하도록 응용 프로그램을 구성해야 합니다. 이 기능이 활성화되어 있으면 ASP.NET은 응용 프로그램 URL에 세션 키를 자동으로 삽입합니다.
일부 장치는 쿠키를 지원하지 않습니다. 장기 클라이언트 상태를 유지하기 위해 응용 프로그램에서는 사용자가 입력한 고객 번호 등의 클라이언트 관련 정보를 사용할 수 있습니다. 쿠키가 있는 클라이언트를 사용할 수 없으므로 응용 프로그램은 즐겨찾기에 추가할 수 있는 대체 페이지를 표시합니다. 다음 샘플에서는 이러한 예를 보여 줍니다. 이 URL로 이동한 사용자들은 고객 ID를 입력하는 폼을 보게 됩니다. 그런 다음 응용 프로그램은 사용자가 즐겨찾기에 추가할 수 있는 대체 URL을 표시합니다.
<%@ Page Inherits="System.Web.UI.MobileControls.MobilePage"
Language="C#"
EnableViewState="false" %>
<script language="c#">
protected void Page_Load(Object sender, EventArgs e)
{
String customerID = Request.QueryString["cid"];
if (customerID != null)
{
// A customer ID was found. Simulate a lookup by
// converting the client ID back to a user.
int underscore = customerID.IndexOf('_');
if (underscore != -1)
{
// If visiting the first time, prompt the user to bookmark.
if (Session["FirstTime"] != null)
{
Session["FirstTime"] = null;
WelcomeLabel.Text = String.Format("Welcome, {0}",
customerID.Substring(0, underscore));
ActiveForm = WelcomeForm;
}
else
{
ReturnLabel.Text = String.Format("Welcome back, {0}",
customerID.Substring(0, underscore));
ActiveForm = ReturnForm;
}
}
}
}
protected void LoginForm_OnSubmit(Object sender, EventArgs e)
{
// Generate a customer ID. Normally, you would create
// a new customer profile.
String customerID = CustomerName.Text + "_" +
System.Guid.NewGuid().ToString();
String path = AbsoluteFilePath + "?cid=" +
Server.UrlEncode(customerID);
Session["FirstTime"] = true;
RedirectToMobilePage(path);
}
</script>
<mobile:Form >
<mobile:Label StyleReference="title">
Welcome to the site. Please register to continue.
</mobile:Label>
<mobile:TextBox id="CustomerName" />
<mobile:Command OnClick="LoginForm_OnSubmit"
Text="Register" />
</mobile:Form>
<mobile:Form id="WelcomeForm" >
<mobile:Label id="WelcomeLabel" />
Please bookmark this page for future access.
</mobile:Form>
<mobile:Form id="ReturnForm" >
<mobile:Label id="ReturnLabel" />
</mobile:Form>
모바일 응용 프로그램의 뷰 상태 최적화
모바일 웹 페이지의 경우 다음과 같은 중요한 고려 사항이 있습니다.
뷰 상태를 세션 상태에 저장하는 기능이 상당히 최적화되었습니다. 저장할 뷰 상태가 없으면 세션에서 아무 것도 저장되지 않으며 클라이언트에 식별자가 전달되지 않습니다. 그러나 응용 프로그램 개발자가 세션 관리를 사용하지 않거나 많은 처리를 할 수 있는 페이지를 만들려면 뷰 상태를 사용하지 않거나 제한적으로 사용하는 것을 고려할 수 있습니다. 예를 들어, 응용 프로그램에서 서식이 지정된 텍스트의 페이지를 렌더링하는 경우와 같은 여러 경우에 있어 뷰 상태는 불필요하며 비활성화하는 것이 좋습니다.
모바일 웹 페이지는 응용 프로그램 뷰 상태 외에 페이지에 대한 다른 종류의 상태 정보도 저장해야 합니다. 이 정보에는 활성 폼이나 폼에 대한 페이지 매김 정보가 포함될 수 있습니다. 이러한 정보는 서버에 유지되지 않고 항상 클라이언트로 전달되며, 일반적으로 최적화된 방식으로 생성됩니다. 예를 들어, 첫 번째 폼이 활성화되어 있거나 폼의 첫 번째 페이지가 표시되어 있는 경우, 이것은 기본 상태이기 때문에 이런 정보는 저장되지 않습니다. 이러한 상태 정보를 전용 뷰 상태라고 합니다. 모든 컨트롤은 LoadPrivateViewState 및 SavePrivateViewState 메서드를 재정의하여 전용 뷰 상태를 읽고 쓸 수 있습니다.
참고: 중요한 정보를 세션 상태에 포함하는 경우에는 보안을 위해 HTTPS 및 SSL/TLS 인증을 사용하여 연결하는 것이 좋습니다.