ASP.NET이라는 언어를 공부를 안한 상태로 처음 프로젝트를 진행했을 때의 일이다.

 

어느날인가 DB에서 불러온 값을 수정 한 후 다시 저장을 하는데 계속 같은 값으로 나오는 것이다.

수차례 클릭을 하면서 저장하는 이벤트 로직과 페이지를 봤지만 특별이 문제가 없었다

그때는 당연히 저장되어야 한다고 생각했다;;

 

대부분은 Copy&Paste로 작업을 해서 그런 문제가 생겼다고 생각을 해

수정이 잘되는 페이지를 열어 본 후 다른점을 발견했다

 

그것이 바로 IspostBack 이라는 것이 Page_Load부분에 들어가 있는 것이였다.

변경후 수정이 잘되는 페이지에는

if(!IsPostBack) {

//데이터 불러온 값을 처리하는 함수

}

와 같은 구조로 되어 있었다.

 

ASP.NET은 기존 다른 WEB PROGRAMMING과는 다른 구조로 되어 있다.

이벤트라는 것을 통하여 자신의 페이지를 POSTBACK 하는 방식으로 데이터를 처리 한다.

 

문제는 수정 버튼을 클릭했을 때 POSTBACK이 일어난다. 그 순간 다시 자신의 페이지를 읽으면서 Page_Load 이벤트를 타게된다.

원래 수정하고자 했던 텍스트 박스에는 다시 DB에서 불러온 값을 다시 넣을 것이고 결국 그 값으로 저장이 된 것이다.

그래서 내가 수정하고자 했던 정보는 계속 같은 값으로 나왔던 것이다.

 

ASP.NET에서는 기본적으로 페이지 수명 주기 이벤트를 이해해야 한다.

  

 페이지 이벤트  일반적인 용도 

 PreInit

이 이벤트의 용도는 다음과 같습니다.

  • IsPostBack 속성을 검사하여 페이지가 처음으로 처리되는 것인지 여부를 확인합니다.
  • 동적 컨트롤을 만들거나 다시 만듭니다.
  • 마스터 페이지를 동적으로 설정합니다.
  • Theme 속성을 동적으로 설정합니다.
  • 프로필 속성 값을 읽거나 설정합니다.

 참고
 요청이 포스트백인 경우에는 컨트롤의 값이 뷰 상태에서 아직 복원되지 않았습니다. 이 단계에서 컨트롤 속성을 설정하면 다음 이벤트에서 속성 값이 덮어쓰여질 수 있습니다.

 

 Init 

 모든 컨트롤을 초기화하고 모든 스킨 설정을 적용한 후에 발생합니다. 이 이벤트를 사용하여 컨트롤 속성을 읽거나 초기화할 수 있습니다.

 InitComplete  Page 개체를 통해 발생합니다. 이 이벤트를 사용하여 모든 초기화를 완료해야 할 작업을 처리할 수 있습니다.
 PreLoad

 이 이벤트는 Load 이벤트에 앞서 페이지나 컨트롤을 처리해야 하는 경우에 사용합니다.

 

Page에서 이 이벤트가 발생한 후에 해당 페이지와 모든 컨트롤에 대한 뷰 상태를 로드하고 Request 인스턴스에 포함된 모든 포스트백 데이터를 처리합니다.

 Load

 Page에서 Page에 대해 OnLoad 이벤트 메서드를 호출한 다음 자식 컨트롤 각각에 대해 동일한 과정을 되풀이합니다. 이 과정이 페이지와 모든 컨트롤을 로드할 때까지 해당 자식 컨트롤 각각에 대해 동일하게 진행됩니다.

 

OnLoad 이벤트 메서드를 사용하면 컨트롤의 속성을 설정하고 데이터베이스 연결을 설정할 수 있습니다.

 컨트롤 이벤트

 이러한 이벤트를 사용하면 Button 컨트롤의 Click 이벤트나 TextBox 컨트롤의 TextChanged 이벤트 같은 특정 컨트롤 이벤트를 처리할 수 있습니다.

 

 참고
 포스트백 요청에서 페이지에 유효성 검사기 컨트롤이 포함되어 있으면 처리를 수행하기 전에 Page 및 각 유효성 검사기 컨트롤의 IsValid 속성을 확인합니다.

 

 LoadComplete  이 이벤트는 페이지의 다른 모든 컨트롤을 로드해야 하는 작업에 대해 사용합니다.
 PreRender

 이 이벤트가 발생하기 전에 다음 과정이 진행됩니다.

  • Page 개체에서 각 컨트롤과 페이지에 대해 EnsureChildControls를 호출합니다.
  • 해당 DataSourceID 속성이 설정되어 있는 데이터 바인딩된 컨트롤 각각에서 해당 DataBind 메서드를 호출합니다. 자세한 내용은 이 항목의 뒷부분에 나오는 데이터 바인딩된 컨트롤에 대한 데이터 바인딩 이벤트를 참조하십시오.

페이지의 각 컨트롤에 대해 PreRender 이벤트가 발생합니다. 이 이벤트를 사용하여 페이지나 해당 컨트롤의 내용을 최종적으로 변경할 수 있습니다.

 SaveStateComplete

 이 이벤트가 발생하기 전에 페이지와 모든 컨트롤에 대해 ViewState가 저장됩니다. 이 시점에서 페이지나 컨트롤에 대한 변경 내용은 모두 무시됩니다.

 

이 이벤트를 사용하여 뷰 상태 저장이 필요한 작업을 수행할 수 있지만 컨트롤을 변경할 수는 없습니다.

 Render

 이는 이벤트가 아닙니다. 대신, 이 처리 단계에서 Page 개체가 각 컨트롤에 대해 이 메서드를 호출합니다. 모든 ASP.NET 웹 서버 컨트롤에는 브라우저에 보내는 컨트롤의 태그를 작성하는 Render 메서드가 있습니다.

 

사용자 지정 컨트롤을 만드는 경우 일반적으로 이 메서드를 재정의하여 컨트롤의 태그를 출력합니다. 그러나 사용자 지정 컨트롤에 표준 ASP.NET 웹 서버 컨트롤만 포함되어 있고 사용자 지정 태그는 포함되지 않은 경우 Render 메서드를 재정의할 필요가 없습니다. 자세한 내용은 사용자 지정 ASP.NET 서버 컨트롤 개발을 참조하십시오.

 

사용자 정의 컨트롤(.ascx 파일)에는 렌더링이 자동으로 포함되므로 코드에서 컨트롤을 명시적으로 렌더링할 필요가 없습니다.

 Unload

 이 이벤트는 각 컨트롤에 대해 발생한 다음 페이지에 대해 발생합니다. 컨트롤에서 이 이벤트를 사용하면 컨트롤별 데이터베이스 연결을 닫는 등 특정 컨트롤에 대한 최종 정리 작업을 수행할 수 있습니다.

페이지 자체에 대해 이 이벤트를 사용하면 열려 있는 파일 및 데이터베이스 연결을 닫거나 로깅 또는 기타 요청에 따른 작업을 마무리하는 등의 최종 정리 작업을 수행할 수 있습니다.

 

 참고
언로드 단계를 수행하는 동안 페이지와 페이지 컨트롤이 렌더링되었으므로 응답 스트림을 추가로 변경할 수 없습니다. Response.Write 등의 메서드를 호출하려고 하면 페이지에서 예외가 throw됩니다.

 

 출처: http://msdn.microsoft.com/ko-kr/library/ms178472.aspx ( MSDN )

 

 추가적인 정보 또한 위의 페이지에 친절하게 나와 있다.

 

+ Recent posts