ASP.NET 페이지 객체 생성 순서(실행기) 포스트백
포스트백(PostBack)
- 폼의 내부 컨트롤(버튼(submit))이 전송이 되면서 자기 자신 페이지를 action으로 재 호출하는 현상
전송버튼을 누르면 자기 자신을 호출을 하는 현상을 포스트백 이름을 붙였다.
- 주로 포스트백은 ASP.NET 컨트롤이 발생
- 그중에서도....ASP.NET 버튼류는 무조건 포스트백을 발생함
- 버튼이외의 컨트롤도 포스트백을 발생시킬수 있음!!!!!!!
(form을 전송 -> document.form1.submit();)
포스트백이 아닌 경우
- 첫요청
- 브라우저 주소창에 직접 주소를 기입해서 페이지를 요청하는 경우
- F5 새로고침
- 자바스크립트나 프로그램 처리에 의해서 페이지 요청되는 경우
- ASP.NET 버튼을 눌러서 접근하는 경우를 제외한 나머지..
ISPostBack
//로드 이벤트 초기화 담당..
//ASP.NET(서버측)에서 초기화 담당.
//IsPostBack : 포스트백이냐? bool 값 반환 첫요청이냐!? FALSE 버튼을 누르면 1번이상이니
//TRUE 반환 두번째 요청이다 그러니 TRUE다!!
Label1.Text = this.IsPostBack.ToString();
속성에서 AutoPostBack false를 true로 변경한다. 텍스트박스를
ASP.NET 페이지 처리 단계
- ASP.NET 페이지 수명 주기
- ASP.NET 페이지 = *.aspx + *.cs
- 클라이언트(브라우저)가 특정 페이지를 요청하면(HTTP Request) 웹서버(IIS)가 처리가 불가능하기 때문에 aspnet_isapi.dll(페이지 생성 프로그램) 실행기에 처리를 위임한다. 실행기는 넘겨받은 페이지를 미리 정해진 규칙에 따라서 단계별로 처리를 한 후 최종 결과물을 클라이언트에게 반환한다.(HTTP Response).
- 페이지 객체 생성부터 페이지 객체 소멸까지의 단계
ASPX 페이지
- + ASPX.CS 파일 <- Behind Code, Beside Code
HTML 이 클래스파일로 변환이된다. HTML페이지가 클래스로 동등하게 취급되기때문에 CS파일에서도 접근이 가능한것
동등한 클래스 관계
브라우저가 서버쪽에 요청 실행기가
1. aspx파일을 찾는다. 그자체 그대로 똑같은 인스턴스 생성(메모리) new ex07이러한 형태로 만든다. 멤버는 label1, 버튼등
2. 아래 순서를 단계별로 1~8단계 까지 수행한다.
1단계 Init실행
2단계는 처음 페이지 실행이기 때문에 텍스트를 찍지 않는다.~,
3단계는 라벨텍스트를 찍고
4단계도 첫요청때는 발생안하니 패스~
5단계는 진행된다
6단계 ViewState 서버 메모리상에 존재하는 공간이다 주로 데이타를 넣고 빼고 할수 있는 커다란 컬렉션(배열) 이라고 생각하라 배열에 현재 라벨에 찍힌 텍스트 박스를 컬렉션에 옮겨담는다.
7단계 먼저 Page Render 전<br />이라는 것을 찍는다. Render 메소드 호출 메모리에 현재 적제된 여기까지 진행된 실제 웹에 표현해야할 객체를 저장한것을 <span> </span>으로 묶어주는 작업 진행 실행기가 눈에보이는것은 임시페이지로 만들고 <input type = "hidden"> 형태로 보이지 않게 적어놓는다. 이단계에서 이와같이 임시 페이지가 생성 되었다. 임시페이지 만드는 작업은 현재 이단계에서 적용되었다. 그후 단계는 이미 임시페이지가 만들어졌기 때문에 웹상에 텍스트가 찍히지 않는다.
8단계가 끝난후 여태까지 생성된 모든 태그의 객체들을 완전히 삭제한다.
다시 또 시작 한다면 처음부터 다시 읽어야 한다. 최종으로 서버에는 아무것도 남지 않는다.
다시 버튼을 누른다면 첫요청이 아니기때문에 포스트백 발생한다.
2단계 처음 init라는 텍스트는 사라지고 뷰스테이트 복구 단계에서 적혀있던 값 그대로 복구가 된다.
3단계 로드 단계는 일어난다.
4단계 포스트백 요청 모든 이벤트는 ButtonClick
5단계 프리랜더
6단게
7단계 Render전
0. 페이지 객체 생성
- aspx 페이지 소스를 원본으로 클래스 인스턴스를 생성
- cs파일의 내용은 이벤트가 발생하면 실행됨
- cs파일은 초기 객체에는 영향이 없음
1. Init
- 0단계에서 만들어진 페이지 객체가 생성된 직 후 객체 초기화를 위해 제공되는 단계
- ViewState값이 복구되기 전이라 컨트롤 제어는 되도록 안함
2. ViewState 복구
- PostBack 요청시 발생하는 단계
- 페이지 상태 유지 단계 -> 이전 요청때의 상태를 기억했다가 복구 단계를 통해서 페이지 객체의 상태를 유지함
- ViewState에 의해서 컨트롤의 상태가 유지됨
2.5 다시 게시된 데이터 처리
- 폼 입력 컨트롤(텍스트박스, 체크박스 등..)의 값이 PostBack에 의해서 현재 페이지로 전송이 되면, 그 전송된 컨트롤의 값을 해당 컨트롤 값으로 적용
- PostBack요청시에만 발생이 되는 이벤트
3. Load
- 페이지 객체가 메모리에 로드되고 난 직 후 발생
- 윈폼의 Form_Load 이벤트와 동일
- 주로 페이지와 초기 작업을 하는 단계
- Init 단계와 달리 ViewState복구가 완료된 단계이기 때문에 컨트롤에 접근해도 상태가 안정되어 있음(안전)
- 가장 코딩이 많은 단계 중 하나
3.5 게시 변경 알림
- 특정 컨트롤의 이벤트 발생 유무 확인 단계(**)
- 이 단계를 통해서 원격지에 있는 클라이언트 컴퓨터의 브라우저안의 컨트롤이 특정 이벤트를 발생시켰는지 확인 가능
- 2단계와 2.5단계간의 컨트롤 값의 변화를 통해서 확인!!!
4. PostBack
- PostBack 요청이 일어나면 발생하는 단계
- 사용자 및 서버 이벤트 발생 단계
- 버튼 클릭, 아이템 선택, 텍스트 변경 등 모든 컨트롤 이벤트는 이 단계에서 처리가 이루어짐
- Load와 같이 가장 코딩이 많은 단계
5. PreRender
- 페이지 객체를 렌더링하기 바로 전 단계
- 페이지 처리 순서에 의한 논리 오류를 해결하기 위해 만든 단계
- 주로 Load에서 하던 일을 이곳에서 처리
6. ViewState
- 페이지 객체와 그 내부에 있는 컨트롤의 내용을 ViewState 공간에 저장하는 단계
- 보통 컨트롤의 상태를 나타내는 속성값이 저장됨(이벤트는 저장 안됨)
- PostBack 요청 ViewState 복구 단계에서 이 값이 사용됨
- 2번과 6번 단게에 의해서 ASP.NET의 상태 유지가 구현됨
7. Render
- 페이지 객체와 그 내부의 컨트롤을 HTML로 변환시키는 단계
- 페이지 객체를 브라우저가 인식 가능한 내용으로 변화
- 브라우저에게 돌려줄 임시 페이지를 만드는 단계
- 페이지 객체 + 컨트롤 + ViewState = 임시 페이지
8. Unload
- 페이지 객체 처리 후 마지막 단계
- 처리가 끝나고 Render까지 마친 페이지 객체를 소멸시키는 단계
- 주로 자원 반홤 코드 구현
- 이 단계가 실행되고 나면 0~7단계에 걸쳐 사용된 페이지 객체이하 모든 자원이 서버 메모리상에서 소멸된다.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex07_PageLifeCycle.aspx.cs" Inherits="Ex07_PageLifeCycle" %>
<!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>
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="포스트백 발생" />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex07_PageLifeCycle : System.Web.UI.Page
{
//Page객체의 이벤트 -> override
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
Label1.Text += "Page Init<br />";
}
protected void Page_Load(object sender, EventArgs e)
{
Label1.Text += "Page Load<br />";
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text += "Button Click(PostBack)<br />";
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
Label1.Text += "Page PreRender<br />";
}
protected override void Render(HtmlTextWriter writer)
{
Label1.Text += "Page Render 전<br />";
base.Render(writer);
Label1.Text += "Page Render 후<br />";
}
protected override void OnUnload(EventArgs e)
{
base.OnUnload(e);
Label1.Text += "Page Unload<br />";
}
}
ViewState 라벨만 빼놓은 상태에서 임시페이지를 돌려주고 그페이지의 상세 내용을 보면 라벨은 빠진것을 볼수 있다.
페이지가 좀 무겁다면 ViewState를 조정하여 페이지 속도를 증가시킬수 있다.
EnableViewState의 속성은 기본적으로 True 로 되어있다 이것의 속성을 false로 바꾸어주면
클라이언트 시간은 : 자바스크립트로
서버시간은 : c#에서
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex09_PostBack.aspx.cs" Inherits="Ex09_PostBack" %>
<!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>
<h2>
Ex09_PostBack.aspx</h2>
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Button ID="Button1" runat="server" Text="Button" Width="145px"
onclick="Button1_Click" />
<br />
<br />
<h3>
버튼이 클릭되면 라벨에 현재 시간을 출력<br />
1. 버튼의 클릭 이벤트 O<br />
2. 버튼의 클릭 이벤트 X</h3>
<br />
<br />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex09_PostBack : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//Label1.Text = DateTime.Now.ToString();
//첫요청 일때만 실행하기 위하여
//매번실행할려면 if문을 빼도록 한다.
//초기화 -> 1회용 -> 아래의 if문은 거의 필수처럼 사용된다.
if (!IsPostBack)
{
Label1.Text = "이곳에 시간이 출력됩니다.";
}
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = DateTime.Now.ToString();
}
}
모든 컨트롤에 AUTO POSTBACK은 안하는것이 좋다. 데이터가 왔다갔다 많이하면 오래걸린다.그래서 안쓰는것이 좋다.
특수한경우가 아닌이상 AUTO POSTBACK은 TRUE로 하지않는 것이 좋다.
되도록 refresh하지 않는 것이 좋다.
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex11_Event.aspx.cs" Inherits="Ex11_Event" %>
<!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>
<h2>
Ex11_Event.aspx</h2>
<br />
이름 :
<asp:TextBox ID="TextBox1" runat="server" AutoPostBack="True"
ontextchanged="TextBox1_TextChanged"></asp:TextBox>
<asp:Label ID="Label2" runat="server" Text="Label"></asp:Label>
<br />
<br />
나이 :
<asp:TextBox ID="TextBox2" runat="server" AutoPostBack="True"
ontextchanged="TextBox2_TextChanged" Width="80px"></asp:TextBox>
<asp:Label ID="Label3" runat="server" Text="Label"></asp:Label>
<br />
<br />
주소 :
<asp:TextBox ID="TextBox3" runat="server" AutoPostBack="True"
ontextchanged="TextBox3_TextChanged" Width="244px"></asp:TextBox>
<asp:Label ID="Label4" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="가입하기"
Width="116px" />
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<br />
<br />
<br />
우편번호 :
<asp:TextBox ID="TextBox4" runat="server" AutoPostBack="True"
ontextchanged="TextBox4_TextChanged"></asp:TextBox>
<br />
<br />
상세주소 :
<asp:TextBox ID="TextBox5" runat="server" Width="369px"></asp:TextBox>
<br />
<br />
<br />
<br />
아이디 :
<asp:TextBox ID="TextBox6" runat="server" AutoPostBack="True"
ontextchanged="TextBox6_TextChanged"></asp:TextBox>
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex11_Event : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void TextBox1_TextChanged(object sender, EventArgs e)
{
Label2.Text = "이름 X";
}
protected void TextBox2_TextChanged(object sender, EventArgs e)
{
Label3.Text = "나이 X";
}
protected void TextBox3_TextChanged(object sender, EventArgs e)
{
Label4.Text = "주소 X";
}
protected void Button1_Click(object sender, EventArgs e)
{
//1. 가입하기 버튼 클릭시 3개의 텍스트박스값을 한번에 유효성 검사(가장 무난한 처리 방식)
//Label1.Text = "이름 X<br />";
//Label1.Text += "나이 X<br />";
//Label1.Text += "주소 X<br />";
}
protected void TextBox4_TextChanged(object sender, EventArgs e)
{
if (TextBox4.Text == "110-111")
TextBox5.Text = "서울시 영등포구";
else if (TextBox4.Text == "110-112")
TextBox5.Text = "서울시 금천구";
}
protected void TextBox6_TextChanged(object sender, EventArgs e)
{
//ID 유효성 검사
if (TextBox6.Text == "test")
Label1.Text = "사용 가능한 ID입니다";
else
Label1.Text = "이미 존재하는 ID입니다";
}
}
PreRender
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex12_PreRender.aspx.cs" Inherits="Ex" %>
<!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 style="height: 226px">
<form id="form1" runat="server">
<div style="height: 227px">
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
[요구사항]<br />
<br />
1. 텍스트박스에 텍스트를 기입하고 버튼을 누르면 서버로 전송한 뒤 data.txt에 그내용을 저장<br />
2. data.txt 저장된 데이터가 문제가 없었는지 Label에도 확인 출력<br />
3. 다음번 현재 페이지를 방문했을땐(첫요청) data.txt안에 있는 내용을 label에 출력</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;
public partial class Ex : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//초기화
//if (!IsPostBack)
//{
// //첫요청
// StreamReader reader = new StreamReader(Server.MapPath("data.txt"));
// Label1.Text = reader.ReadToEnd();
// reader.Close();
//}
}
protected void Button1_Click(object sender, EventArgs e)
{
//경로 표현
//\ : 로컬 경로(하드에 무언가를..) 윈폼
/// : 웹 경로(URL)
//4. PostBack 단계
//StreamWriter writer = new StreamWriter(@"D:\[09]ASPNET\ASPNETEx\data.txt");
//Server.MapPath()
// - 웹경로를 물리적인 로컬경로로 반환
StreamWriter writer = new StreamWriter(Server.MapPath("./data.txt"));
writer.WriteLine(TextBox1.Text);
writer.Close();
//Label1.Text = Server.MapPath("./data.txt");
//확인
//StreamReader reader = new StreamReader(Server.MapPath("./data.txt"));
//Label1.Text = reader.ReadToEnd();
//reader.Close();
}
protected override void OnPreRender(EventArgs e)
{
base.OnPreRender(e);
//5번 이벤트
// 1. Load와 동일하게 첫요청&포스트백 요청시 발생(항상 발생)
// 2. 이벤트 시점이 4.PostBack 직후에 발생
StreamReader reader = new StreamReader(Server.MapPath("./data.txt"));
Label1.Text = reader.ReadToEnd();
reader.Close();
}
}
Trace
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex13_Trace.aspx.cs" Inherits="Trace" %>
<!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="height: 363px">
<h2>
Ex13_Trace.aspx</h2>
<h3>
<br />
Trace(추적) 기능 - 개발자의 위한 기능<br />
<br />
1. 현재 요청에 대한 정보<br />
<br />
2. 컨트롤 트리(***)<br />
<br />
3. 페이지 처리 단계 정보</h3>
<p>
</p>
<br />
<br />
<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
<br />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Trace : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
for (int i = 0; i < 1000000000; i++)
{
}
//Trace 정보를 이용하는 방법
Trace.Warn("사용자", "로드에서 무슨일이?");
}
protected void Button1_Click(object sender, EventArgs e)
{
Label1.Text = TextBox1.Text;
Trace.Write("사용자", "버튼클릭했다...확인..");
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex14_ControlTree.aspx.cs" Inherits="Ex14_ControlTree" %>
<!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>
EX14_ControlTree.aspx<br />
<br />
<br />
컨트롤 트리(Control Tree)<br />
- Trace에서 확인 가능한 트리 구조<br />
- 0단계에서 생성되는 페이지 객체의 실체<br />
- 모든 컨트롤은 Page 객체의 자식으로 형성<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex14_ControlTree : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//컨트롤로 자식들로 관리가 된다 아주편하게~~~
//컨트롤 트리의 상황을 -> Label1에 출력
string result = "", temp = "";
//페이지 객체(0단계 - aspx페이지)
//__PAGE == this
for (int i = 0; i < this.Controls.Count; i++)
{
Control c = this.Controls[i];
//c이 만약 리터럴이면..? -> 내용 출력
if (c is LiteralControl)
{
LiteralControl li = c as LiteralControl;
temp = li.Text.Replace("<", "<").Replace(">", ">");//순수한 문자열 <br />
}
else
{
temp = "";
}
result += string.Format("<p style='color:red;'>{0} {1}</p><p style='color:blue;'>{2}</p>", c.UniqueID, c.ToString(), temp);
//c가 자식이 있다면 탐색
for (int j = 0; j < c.Controls.Count; j++)
{
Control d = c.Controls[j];
if (d is LiteralControl)
{
temp = ((LiteralControl)d).Text.Replace(">", ">").Replace("<", "<");
}
else
{
temp = "";
}
result += string.Format("<p style='color:red;'> {0} {1}</p><p style='color:blue;'>{2}</p>", d.UniqueID, d.ToString(), temp);
}
}
Label1.Text = result;
}
protected void Button1_Click(object sender, EventArgs e)
{
//컨트롤 트리.. 윈폼부터
//Label1.Text = this.Controls.Count.ToString();
//this.Controls.Clear();
}
}
<%@ Page Language="C#" AutoEventWireup="true" CodeFile="Ex15_ControlTree.aspx.cs" Inherits="Ex15_ControlTree" Trace="true" %>
<!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>
Ex15_ControlTree.aspx<br />
<br />
<br />
<asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>
<br />
<br />
<br />
<asp:Button ID="Button1" runat="server" onclick="Button1_Click" Text="Button" />
<br />
<br />
<br />
</div>
</form>
</body>
</html>
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
public partial class Ex15_ControlTree : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void Button1_Click(object sender, EventArgs e)
{
//라벨접근 가능이유? 식별자가 있기 때문이다.
//asp에서 ID로 접근
//컨트롤 트리에 소속되지 않는것은 존재할수 없다.
Label1.Text = DateTime.Now.ToString();
}
}
ASP .NET 4.0 질문이 가장 중요한것(그림까지 곁들여 설명하는것이 더좋다)
1. 페이지 처리 단계
2. 포스트백
3. ViewState
4. 컨트롤 트리
5. 상태유지