ASP.NET 상태관리(ViewState 뷰스테이트 컬렉션)

홈 > 공유팁! > 프로그램 관련
프로그램 관련

ASP.NET 상태관리(ViewState 뷰스테이트 컬렉션)

꽁스짱 0 1352
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">

<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();
        }
    }
}

0 Comments
제목