ASP.NET 상태관리(ViewState 뷰스테이트 컬렉션)
꽁스짱
ASP.NET
0
1800
2021.02.17 02:03
ASP.NET 상태관리(ViewState 뷰스테이트 컬렉션)
페이지를 원래 위치에 다시 게시할 때 라운드트립 간에 고유의 페이지 관련 값을 저장
페이지에서 숨겨진 필드로 유지
장점
서버 리소스 불필요(페이지 코드 내의 구조에 포함)
구현의 용이성
페이지 및 컨트롤 상태 자동 보존
단점
사용자가 페이지를 표시하고 게시할 때 네트워크 부하
보안(데이터 훼손 가능성, 숨겨진 필드에 포함된 정보를 볼 수 있으므로 보안 문제가 발생 가능)
렌더링될 때 직렬화(serialize)과정을 거치기 때문에 SerializableAttribute가 적용되는 데이터 타입으로 제한
일반적인 웹 페이지는 HTML의 TEXT에 글을 입력하고 리로드 버튼을 누르면 다시 열리는 페이지에서는 입력된 값이 사라지게 된다.
ASP.NET에서 보내는 hidden 필드(ViewState)는 압축된 형태로 모든 서버컨트롤의 상태 정보를 가지며 이를통해 웹 브라우저와 지속적으로 정보를 교환한다.
폼을 전송하거나 이벤트 발생시 viewstate가 서버로 전송
서버에서 이벤트 처리 후 클라이언트로 viewstate 다시 전송
ViewState를 이용하여 웹 페이지를 끊임없이 실행되는 응용프로그램처럼 다룰 수 있다.
Page 객체의 IsPostBack속성을 통하여 확인
Web control의 AutoPostBack 속성이 true이면 이벤트 발생시 바로 전송
ViewState의 정보는 내부적으로 System.Web.UI.StateBag 개체를 사용하여 이름/값을 갖는 형태로 저장
ViewState란 말은 페이지의 PostBack 사이에 데이터를 유지하는 메커니즘을 나타낸 말이며 실제 그러한 기능은 StateBag 클래스로써 제공 되는 것이다.
ASP.NET에서는 이를 읽어 해석 할 수 있다.
만일 어떤 데이터가 PostBack 간에 유지 되어야 한다면 ASP에서는 세션 등을 이용했지만 .NET에서는 StateBag을 사용
서버 컨트롤에 의해 자동으로 생성되는 뷰 상태(ViewState) 이외에도 ASP.NET에서는 개발자가 임의로 정보를 뷰 상태에 저장 가능하도록 Page 객체에 ViewState 컬렉션 속성을 사용한다.
ViewState 속성에서 새 요소를 만들어 저장
ViewState["color"] = "red“;
해당 이름을 지정하여 요소의 값 접근
string strColor;
strColor =(string)ViewState["color"];
[예제]
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="updown.aspx.cs" Inherits="WebApplication1.updown" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div style="text-align: center">
<asp:Label ID="lblTitle" runat="server" style="text-align: center"
Text="속도를 조정 하세요"></asp:Label>
<br />
<br />
<asp:Button ID="btnUp" runat="server" onclick="btnUp_Click" Text=" UP " />
<asp:Button ID="btnDown" runat="server" onclick="btnDown_Click" Text="DOWN" />
<br />
<br />
<br />
<asp:TextBox ID="txtMsg" runat="server"></asp:TextBox>
<asp:Label ID="Label1" runat="server" Text="Km/h"></asp:Label>
</div>
</form>
</body>
</html>
---------------------------------------------------------
namespace WebApplication1
{
public partial class updown : System.Web.UI.Page {
protected int speed = 0; //현재의 스피드를 저장 할 변수, 최초 속도는 0
protected void ShowSpeed() {
txtMsg.Text = speed.ToString();
}
//페이지의 구성요소가 생성되고 가장 먼저 발생, 최초요청이 아닌 경우 ViewState 컬렉션의 값을 speed에 할당
protected void Page_Load(object sender, EventArgs e) {
if (IsPostBack) { speed = (int)ViewState["speed"]; }
ShowSpeed();
}
//HTML문서를 만들기 직전에 발생하는 이벤트, 최종적으로 컨트롤, 변수의 상태를 변경
//speed 변수의 값을 ViewState에 저장하자.
protected void Page_PreRender(object sender, EventArgs e) { ViewState["speed"] = speed; }
//속도 10증가
protected void btnUp_Click(object sender, EventArgs e) { speed = speed + 10;
ShowSpeed(); //현재 속도를 화면에 출력
}
//속도 10감소
protected void btnDown_Click(object sender, EventArgs e) {
if (speed >= 10) { speed = speed – 10; }
ShowSpeed();
}
}
}