ASP.NET의 거의 모든 프로그래밍은 웹 폼 위에서 이루어집니다.
웹 폼은 ASP.NET 페이지(.aspx)와 같은 개념으로써 ASP.NET 프로그래밍을 하기 위해 사용하는 Form(형틀) 또는 기반입니다. ASP.NET 개발자는 이 웹 폼 위에서 웹 페이지를 디자인하고 소스코드를 작성합니다. 웹 폼은 크게 다음과 같은 두 부분으로 구성됩니다.
표현 부분( 웹 폼의 시각적인 부분을 담당 )
코드 부분( 웹 폼의 내부 로직 부분을 담당 )
코드 부분에는 .NET 언어를 통해 작성한 내부 로직이 위치하며 표현 부분에는 태그, 서버 컨트롤, 정적 텍스트와 같이 웹 폼을 시각적으로 나타낼 수 있는 요소가 위치합니다. 이렇게 구성된 웹 폼을 특정 사용자가 요청했을 때 ASP.NET은 코드 부분에 정의되어 있는 내부 로직과 표현 부분에 정의되어 있는 시각적 요소를 조합하여 처리한 후 그 결과(HTML 형식의 웹 피이지)를 사용자에 돌려줍니다. VS 2005에서는 웹 폼의 효율적인 작성을 위해 소스 뷰와 디자인 뷰를 지원합니다.
소스 뷰는 웹 폼의 구조를 소스 그대로 보여주는 창이고, 디자인 뷰는 웹 폼의 표현 부분을 비주얼하게 보여주는 창입니다. 소스 뷰와 디자인 뷰는 서로 동기화되어 있으므로 수정하면 수정된 내용이 서로 자동적으로 반영됩니다.
웹 폼에는 다음과 같은 두 가지 코드 모델이 있습니다.
단일 파일 페이지 모델
코드 숨김 페이지 모델
단일 파일 페이지 모델은 웹 폼의 코드 부분과 표현 부분이 .aspx 파일(동일한 웹폼)에 같이 존재하는 형태이고, 코드 숨김 페이지 모델은 웹 폼의 표현 부분은 .aspx 파일에 놓여지고 코드 부분은 다른 클래스 파일(.cs파일)에 놓여지는 형태입니다. 단일 페이지 모델과 숨김 페이지 모델은 기능적으로 동일하며 런타임에 같은 방식으로 실행되므로 성능에 차이가 없습니다.
웹 폼에는 여러 이벤트가 있으며 개발자는 이 이벤트를 통해 웹 폼의 처리 과정 중 특정 시점에서 원하는 내부 로직을 작성할 수 있습니다.
이벤트와 이벤트 처리기
.NET 응용 프로그램에서의 이벤트는 코드로 응답하거나 처리할 수 있는 동작 자체를 의미합니다. ASP.NET의 서버 컨트롤과 웹 폼은 여러 상황에 맞게 미리 정의된 이벤트 집합을 개발자에게 제공합니다.
이벤트 처리기(Event Handler)는 이벤트에 바인딩되는 메서드입니다. 이벤트가 발생하면 이벤트와 연결된(바인딩된) 이벤트 처리기의 코드(내부 로직)가 실행됩니다. 또한 모든 이벤트 처리기는 다음과 같이 두 개의 매개변수를 전달합니다.
하나는 이벤트가 발생한 개체를 나타내는 개체(sender)이며 다른 하나는 이벤트 관련 정보를 포함하는 개체(e)입니다. 특히 두번째 매개변수는 주로 EventArgs 형식이지만 일부 서버 컨트롤들은 나름대로의 고유 형식을 사용합니다.
실습 : 단일 파일 페이지 모델의 웹 폼에 Load 이벤트 처리기 등록하기
새 프로젝트에서 ASP.NET 웹 사이트 선택 -> 언어는 Visual C# 선택 -> 기본 만들어지는 Default.aspx, Default.aspx.cs 파일 삭제
새 항목 추가
다른 파일에 코드 입력 체크를 해지 해야 단일 페이지 모델이 됩니다.
솔루션 탐색기에서 새 항목 추가로 생성한 파일을 더블클릭하여 소스 뷰에 나타나도록 합니다.
소스 뷰 상단의 '개체 및 이벤트' 드롭다운리스트에서 Page 개체를 선택합니다.
'개체 및 이벤트' 드롭다운리스트에서 Page 개체를 선택하면 그 옆에 위치한 드롭다운리스트에 Page 개체에서 제공하는 모든 이벤트들이 리스팅됩니다. 여기서 Load 이벤트를 선택합니다.
Page 개체의 Load 이벤트를 선택하면 Page_Load()라는 Load 이벤트 처리기(메서드)가 웹 폼의 코드 부분(<script runat="server"></script>태그 사이)에 자동적으로 등록됩니다.
단일 페이지 모델에서 코드 부분은 반드시 <script runat="server"> </script> 태그 사이에 위치해야 합니다.
Init 이벤트 -> LoadViewState 이벤트 -> Load 이벤트 -> 서버 컨트롤 이벤트(예: Button 컨트롤의 Click 이벤트) -> PreRender 이벤트 -> SaveView State 이벤트 -> Unload 이벤트
Init 이벤트는 LoadViewState 라는 이벤트 이전에 발생합니다. LoadViewState이벤트는 서버 컨트롤의 정보를 가지고 있는 뷰 상태(View State)라는 것을 Load(복원)하는 이벤트 입니다. 즉, Init 이벤트는 LoadViewState 이벤트 이전에 발생하는 이벤트이므로 서버 컨트롤 개체를 사용할 수 없습니다. 반면에 Load, PreRender 이벤트는 LoadViewState 이벤트 이후에 발생하는 이벤트이므로 서버 컨트롤 개체를 사용할 수 있습니다. 이렇게 웹 폼의 이벤트들은 그 실행순서가 다를 뿐만 아니라 그 안에서 처리할 수 있는 내용 또한 다릅니다.
사용자의 브라우저는 서버에서 처리된 결과를 HTML과 클라이언트 스크립트로 받아서 보여주는 역할만 할 뿐입니다. 사용자가 웹 페이지에서 입력한 정보나 변경한 정보는 서버로 다시 전송되며 ASP.NET은 전송된 정보를 기초로 하여 ASP.NET 페이지를 서버에서 처리한 후 그 결과를 사용자에게 다시 되돌려 줍니다. 이렇게 자신을 타겟으로 하여 현재 페이지를 다시 서버로 전송하는 프로세스를 다시 게시라고 합니다. 단, 사용자가 페이지를 처음 요청하는 것은 다시 게시가 아닙니다. 페이지가 처음 로드된 후 다시 게시를 일으키는 서버 컨트롤(버튼, 드롭다운리스트 등등)을 통해 현재 페이지를 다시 서버로 전송할 때가 바로 다시 게시가 일어나는 시점입니다.
페이지 간 게시는 타겟을 다른 대상 페이지로 하여 현재 페이지를 서버로 전송하는 프로세스입니다.
페이지 간 게시된 페이지(Ex06_2.aspx)에서 이전 페이지(Ex06_1.aspx)의 개체에 접근하기 위해서는 PreviousPage 개체를 사용합니다. PreviousPage 개체의 FindControl() 메서드에 참조할 서버 컨트롤의 ID를 인수로 넘겨주면 해당 서버 컨트롤을 참조할 수 있습니다. 특히 FindControl() 메서드의 반환 값 형식이 object 형식이므로 참조하려는 개체를 해당 형식으로 캐스팅해 주어야 합니다. 그리고 만약 Ex06_1.aspx 페이지에서 페이지 간 게시 기능을 사용하지 않고 바로 Ex06_2.aspx 페이지에 접근했다면 PreviousPage 개체는 null 값을 갖습니다.
구성 파일은 응용 프로그램이나 웹 사이트에 대한 옵션 설정 정보가 들어 있는 .config확장자를 가진 XML 파일입니다. 구성 파일에는 설정 정보가 웹 서버 전체에 영향을 미치는 Machine.config 파일과 설정 정보가 해당 웹 응용 프로그램 또는 해당 폴더에만 영향을 미치는 Web.config 파일이 있습니다. 구성 파일은 데이터베이스 연동 설정 정보를 비롯하여 ASP.NET 2.0에 새로 추가된 기능들(테마, 마스터 페이지, 프로필, 웹 파트 등등)의 설정 정보를 저장하는 데에도 사용됩니다.
Global.asax 파일은 ASP.NET 응용 프로그램 파일이라고도 하며 ASP.NET에 의해 발생되는 응용 프로그램 수준의 이벤트(웹 응용 프로그램 시작 이벤트, 웹 응용 프로그램 종료 이벤트 등등)를 처리하는 파일입니다. 이 Global.asax 파일은 ASP.NET 응용 프로그램의 루트 디렉토리에 위치하며 직접적인 URL 요청을 자동 거부하도록 설정되어 있습니다. 따라서 외부 사용자는 이 파일을 내려받거나 코드를 볼 수 없습니다.
Init 이벤트 -> LoadView State 이벤트 -> Load 이벤트 -> 서버 컨트롤 이벤트 -> PreRender 이벤트 -> SaveView State 이벤트 -> Unload 이벤트
마스터 페이지 : Init
콘텐츠 페이지 : Init
콘텐츠 페이지 : PreLoad
콘텐츠 페이지 : Load
마스터 페이지 : Load
콘텐츠 페이지 : Button1_click
콘텐츠 페이지 : LoadComplete
콘텐츠 페이지 : PreRender
마스터 페이지 : PreRender
콘텐츠 페이지 : PreRenderComplete