다음을 통해 공유


ASP.NET 웹 서버 컨트롤 이벤트 모델

업데이트: 2007년 11월

ASP.NET의 중요한 기능은 클라이언트 응용 프로그램의 모델과 비슷한 이벤트 기반 모델을 사용하여 웹 페이지를 프로그래밍할 수 있다는 점입니다. 간단한 예로, ASP.NET 웹 페이지에 단추를 추가한 다음 단추의 클릭 이벤트를 처리하는 이벤트 처리기를 작성할 수 있습니다. 이러한 모델은 클라이언트 스크립트(동적 HTML에서 단추의 onclick 이벤트 처리)에서만 단독으로 작동하는 웹 페이지에서는 일반적인 모델이지만, ASP.NET은 이 모델을 서버 기반으로 처리합니다.

ASP.NET 서버 컨트롤에 의해 발생한 이벤트는 기존의 HTML 페이지나 클라이언트 기반 웹 응용 프로그램 이벤트와는 약간 다른 방식으로 작동합니다. 이러한 차이는 주로 이벤트가 처리되는 위치와 이벤트 자체가 분리되었기 때문에 발생합니다. 클라이언트 기반 응용 프로그램에서 이벤트는 클라이언트에서 발생하고 처리됩니다. 하지만 ASP.NET 웹 페이지의 경우 서버 컨트롤과 연결된 이벤트는 클라이언트(브라우저)에서 시작되지만 ASP.NET 페이지에 의해 웹 서버에서 처리됩니다.

클라이언트에서 발생하는 이벤트의 경우 ASP.NET 웹 컨트롤 이벤트 모델에서 이벤트 정보는 클라이언트에서 캡처되고 이벤트 메시지는 HTTP 게시를 통해 서버로 전송되어야 합니다. 페이지는 게시를 해석하여 어떤 이벤트가 발생했는지 확인하고 서버의 코드에서 적절한 메서드를 호출하여 이벤트를 처리해야 합니다.

ASP.NET은 이벤트를 캡처, 전송 및 해석하는 작업을 처리합니다. ASP.NET 웹 페이지에서는 일반적으로 이벤트 정보를 어떻게 캡처하여 코드에서 사용할 수 있게 할 것인지에 대해 신경 쓰지 않고도 이벤트 처리기를 만들 수 있습니다. 사용자는 기존의 클라이언트 폼에서와 같은 방법으로 이벤트 처리기를 만들 수 있습니다. 하지만 ASP.NET 웹 페이지의 이벤트 처리에 대해서는 다음과 같은 점에 주의해야 합니다.

서버 컨트롤 및 페이지에 대해 설정된 이벤트

대부분의 ASP.NET 서버 컨트롤 이벤트는 처리를 위해 서버로 라운드트립되어야 하므로 페이지의 성능에 영향을 줄 수 있습니다. 따라서 서버 컨트롤은 주로 클릭 형식의 이벤트로만 한정된 제한적인 이벤트 집합을 제공합니다. 일부 서버 컨트롤은 변경 이벤트를 지원합니다. 예를 들어 CheckBox 웹 서버 컨트롤은 사용자가 확인란을 클릭할 때 서버 코드에서 CheckedChanged 이벤트를 발생시킵니다. 일부 서버 컨트롤은 좀 더 추상적인 이벤트를 지원합니다. 예를 들어 Calendar 웹 서버 컨트롤은 클릭 이벤트를 좀 더 추상화한 버전인 SelectionChanged 이벤트를 발생시킵니다.

onmouseover 이벤트와 같이 사용자가 모르게 자주 발생하는 이벤트는 서버 컨트롤에서 지원되지 않습니다. ASP.NET 서버 컨트롤에서는 아래의 ASP.NET 웹 서버 컨트롤 이벤트 모델에서 설명하는 것과 같이 이러한 이벤트에 대한 클라이언트측 처리기를 계속 호출할 수 있습니다.

컨트롤과 페이지 자체도 각 처리 단계에서 Init, Load 및 PreRender와 같은 수명 주기 이벤트를 발생시킵니다. 응용 프로그램에서 이러한 수명 주기 이벤트를 활용할 수 있습니다. 예를 들어, 페이지의 Load 이벤트에서는 컨트롤의 기본값을 설정할 수 있습니다.

이벤트 인수

서버 기반 ASP.NET 페이지 및 컨트롤 이벤트는 이벤트 처리기 메서드를 위한 표준 .NET Framework 패턴을 따릅니다. 모든 이벤트는 두 개의 인수를 전달합니다. 하나는 이벤트가 발생한 개체를 나타내는 개체이며 다른 하나는 이벤트 관련 정보를 포함하는 이벤트 개체입니다. 두 번째 인수는 주로 EventArgs 형식이지만 일부 컨트롤은 고유 형식을 갖고 있습니다. 예를 들어 ImageButton 웹 서버 컨트롤의 경우 두 번째 인수는 사용자가 클릭한 좌표에 대한 정보가 들어 있는 ImageClickEventArgs 형식입니다.

참고:

페이지의 Load 이벤트와 같은 페이지에 대한 이벤트는 두 개의 표준 인수를 받아들일 수 있지만 이러한 인수에는 값이 전달되지 않습니다.

서버 컨트롤의 다시 게시 이벤트 및 다시 게시되지 않는 이벤트

서버 컨트롤에서 클릭 이벤트와 같은 특정 이벤트가 발생하면 페이지가 즉시 서버에 다시 게시됩니다. HTML 서버 컨트롤이나 TextBox 컨트롤과 같은 웹 서버 컨트롤의 변경 이벤트는 즉시 게시되지 않습니다. 그 대신 다음에 게시가 발생할 때 함께 게시됩니다.

참고:

브라우저가 지원하는 경우 유효성 검사 컨트롤은 서버로 라운드트립하지 않고 클라이언트 스크립트를 사용하여 사용자 입력을 검사할 수 있습니다. 자세한 내용은 ASP.NET 웹 페이지에서 사용자 입력 유효성 검사를 참조하십시오.

페이지가 다시 게시된 다음 페이지의 초기화 이벤트(Page_Init 및 Page_Load)가 발생한 후 컨트롤 이벤트가 처리됩니다. 페이지 이벤트 처리에 대해 자세히 알고 있지 않은 경우에는 특정 순서로 발생하는 변경 이벤트를 사용하는 응용 프로그램 논리를 만들어서는 안 됩니다. 자세한 내용은 ASP.NET 페이지 수명 주기 개요를 참조하십시오.

응용 프로그램에 필요한 경우에는 페이지가 게시되도록 변경 이벤트를 지정할 수 있습니다. 변경 이벤트를 지원하는 웹 서버 컨트롤에는 AutoPostBack 속성이 포함됩니다. 이 속성을 true로 설정하면 컨트롤의 변경 이벤트가 발생할 때 클릭 이벤트를 기다리지 않고 페이지가 즉시 게시됩니다. 예를 들어 CheckBox 컨트롤의 CheckedChanged 이벤트는 기본적으로 페이지를 전송하지 않습니다. 하지만 컨트롤의 AutoPostBack 속성을 true로 설정하면 사용자가 확인란을 클릭하자 마자 페이지가 처리되도록 서버로 즉시 전송됩니다.

참고:

AutoPostBack 속성이 제대로 작동하려면 사용자의 브라우저가 스크립팅을 허용하도록 설정되어야 합니다. 이것은 대부분의 경우 기본적으로 설정되어 있습니다. 그러나 사용자가 보안을 위해 스크립팅을 비활성화하는 경우도 있습니다. 자세한 내용은 ASP.NET 웹 페이지의 클라이언트 스크립트를 참조하십시오.

전달된 이벤트

Repeater, DataList, GridView, FormViewDetailsView 컨트롤과 같은 웹 서버 컨트롤은 이벤트를 발생시키는 단추 컨트롤을 포함할 수 있습니다. 예를 들어 GridView 컨트롤의 각 행에는 템플릿에 의해 동적으로 생성되는 하나 이상의 단추가 포함될 수 있습니다.

각 단추에서 이벤트가 개별적으로 발생하는 것이 아니라 중첩된 컨트롤에서 발생하는 이벤트가 컨테이너 컨트롤로 전달됩니다. 그러면 컨테이너에서는 원래의 이벤트가 어떤 컨트롤에서 발생했는지 알 수 있는 매개 변수와 함께 범용 ItemCommand 이벤트가 발생합니다. 이 단일 이벤트에 응답하면 하위 컨트롤에 대한 이벤트 처리기를 개별적으로 작성할 필요가 없습니다.

ItemCommand 이벤트에는 두 개의 표준 이벤트 인수가 있습니다. 하나는 이벤트의 소스를 참조하는 개체이며 다른 하나는 이벤트 관련 정보가 있는 이벤트 개체입니다.

참고:

GridView, DataList 및 기타 데이터 컨트롤은 전달된 이벤트의 특별한 경우인 EditCommand, DeleteCommand 및 UpdateCommand와 같은 추가 이벤트를 지원합니다.

단추의 CommandArgument 속성을 사용하여 사용자가 지정한 문자열을 이벤트 처리기로 전달함으로써 이벤트를 발생시킨 단추를 식별할 수 있습니다. 예를 들어 DataList 컨트롤의 단추는 ItemCommand 이벤트를 발생시킵니다. 각 단추의 CommandArgument 속성을 다르게 설정할 수 있습니다. 한 단추의 값이 "ShowDetails"이고 다른 단추의 값이 "AddToShoppingCart"이면 나중에 이벤트 처리기에서 이러한 값이 캡처됩니다.

이벤트를 메서드에 바인딩

이벤트는 "단추를 클릭했습니다"와 같은 메시지입니다. 응용 프로그램에서는 이러한 메시지를 코드의 메서드 호출로 변환해야 합니다. 이벤트 메시지와 특정 메서드 간의 바인딩, 즉 이벤트 처리기는 이벤트 대리자를 사용하여 수행됩니다. 자세한 내용은 이벤트 및 대리자를 참조하십시오.

ASP.NET 웹 페이지에서는 페이지에서 컨트롤이 선언적으로 태그에서 만들어진 경우 대리자를 명시적으로 코딩할 필요가 없습니다. 이벤트 바인딩은 바인딩하려는 이벤트 및 사용 중인 프로그래밍 언어에 따라 다양한 방식으로 수행될 수 있습니다. 자세한 내용은 방법: ASP.NET 웹 페이지에서 이벤트 처리기 만들기를 참조하십시오.

컨트롤 이벤트 바인딩

페이지에 선언된 컨트롤의 경우, 사용자는 컨트롤의 태그에 특성(속성)을 설정하여 메서드에 이벤트를 바인딩할 수 있습니다. 다음 코드 예제에서는 ASP.NET Button 컨트롤의 Click 이벤트를 ButtonClick이라는 메서드로 바인딩하는 방법을 보여 줍니다.

<asp:button id="SampleButton"  
   text="Submit" onclick="ButtonClick" />

페이지가 컴파일되면 ASP.NET에서 ButtonClick이라는 메서드를 조회하고 메서드의 시그니처(두 개의 인수를 받아들이는 경우, Object 형식의 인수와 EventArgs 형식의 인수)가 적합한지 확인합니다. 그런 다음 ASP.NET에서 이벤트를 메서드에 자동으로 바인딩합니다.

Visual Basic에서는 다음 코드 예제에서와 같이 이벤트 처리기 선언에서 Handles 키워드를 사용하여 이벤트를 메서드에 바인딩할 수 있습니다.

Private Sub ButtonClick(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles SampleButton.Click

페이지 이벤트 바인딩

ASP.NET 페이지는 Init, Load, PreRender와 같은 수명 주기 이벤트를 발생시킵니다. 기본적으로 사용자는 Page_eventname의 명명 규칙을 사용하여 페이지 이벤트를 메서드에 바인딩합니다. 예를 들어 페이지의 Load 이벤트에 대한 처리기를 만들려는 경우 Page_Load라는 메서드를 만들 수 있습니다. 컴파일 타임에 ASP.NET은 이 명명 규칙에 따라 메서드를 찾고 이벤트와 메서드 사이의 바인딩을 자동으로 수행합니다. 사용자는 Page 클래스에 의해 노출되는 모든 이벤트에 대해 Page_eventname의 규칙을 사용할 수 있습니다.

참고:

페이지 이벤트 처리 메서드에는 인수가 필요 없습니다.

원하는 경우 처리기를 명시적으로 만들 수 있습니다. 메서드 명명 규칙에 따른 페이지 이벤트의 자동 바인딩은 AutoEventWireup이라는 페이지 속성에 의해 제어됩니다. 기본적으로 이 속성은 true로 설정되며, ASP.NET은 앞에서 설명한 대로 자동 조회와 바인딩을 수행합니다. 또는 @ Page 지시문에 AutoEventWireup=false 특성을 추가하여 이 속성을 false로 설정할 수 있습니다. 그런 다음 임의의 이름으로 메서드를 만들고 이를 페이지 이벤트에 명시적으로 바인딩할 수 있습니다. Visual Basic에서는 다음 코드 예제와 같이 Handles 키워드를 사용할 수 있습니다.

Sub MyPageLoad(sender As Object, e As EventArgs) Handles MyBase.Load

AutoEventWireup 특성의 단점은 페이지 이벤트 처리기에 미리 예측할 수 있는 이름이 필요하다는 것입니다. 이러한 단점으로 인해 이벤트 처리기의 이름을 지정하는 방식이 제한됩니다.

참고:

페이지 이벤트에 명시적인 바인딩을 포함시킬 경우에는 잘못해서 메서드가 두 번 호출되지 않도록 하기 위해 AutoEventWireup 속성을 false로 설정해야 합니다.

동적 컨트롤에 대한 명시적 바인딩

컨트롤을 태그에서 선언하여 만드는 경우, onclick과 같은 특성을 사용하거나 Visual Basic의 경우 Handles 키워드를 사용하여 이벤트를 메서드에 바인딩할 수 있습니다. 컨트롤을 코드에서 동적으로 만드는 경우에는 컴파일 타임에 컴파일러에 컨트롤에 대한 참조가 없기 때문에 이러한 메서드를 사용할 수 없습니다.

이러한 경우에는 명시적인 이벤트 바인딩을 사용해야 합니다. Visual Basic의 경우 동적으로 만들어진 컨트롤의 이벤트를 기존 메서드에 바인딩하기 위해 AddHandler 문을 사용할 수 있습니다. C#의 경우에는 대리자를 만들고 컨트롤의 이벤트와 연결할 수 있습니다. 다음 코드 예제에서는 ButtonClick이라는 메서드를 단추의 Click 이벤트에 바인딩하는 방법을 보여 줍니다.

Dim b As New Button
b.Text = "Click"
AddHandler b.Click, AddressOf ButtonClick
Placeholder1.Controls.Add(b)
Button b = new Button;
b.Text = "Click";
b.Click += new System.EventHandler(ButtonClick);
Placeholder1.Controls.Add(b);

ASP.NET 서버 컨트롤의 클라이언트 이벤트 및 서버 이벤트에 대한 응답

이 항목에서는 서버 코드에서 발생한 이벤트를 처리하는 방법에 대해 설명합니다. 컨트롤은 요소를 브라우저로 렌더링하고, 이러한 요소는 또한 사용자가 클라이언트 스크립트에서 처리할 수 있는 클라이언트측 이벤트를 발생시킬 수 있습니다. 클라이언트 스크립트를 사용하면 ASP.NET 서버 컨트롤에 마우스 및 키보드 이벤트 처리를 추가할 수 있습니다. 자세한 내용은 ASP.NET 웹 페이지의 클라이언트 스크립트방법: ASP.NET 웹 서버 컨트롤에 클라이언트 스크립트 이벤트 추가를 참조하십시오.

응용 프로그램 이벤트와 세션 이벤트

페이지와 컨트롤 이벤트 외에 ASP.NET은 응용 프로그램이 시작하거나 중지될 때 또는 각 사용자의 세션이 시작하거나 중지될 때 발생하는 수명 주기 이벤트를 사용할 수 있는 다음과 같은 방법을 제공합니다.

  • 응용 프로그램 이벤트는 응용 프로그램에 대한 모든 요청에 대해 발생합니다. 예를 들어, 응용 프로그램에서 ASP.NET 웹 페이지나 XML Web services가 요청되는 경우 HttpApplication 개체의 BeginRequest 이벤트(Application_BeginRequest)가 발생합니다. 이 이벤트를 사용하면 응용 프로그램에 대한 각 요청에 사용될 리소스를 초기화할 수 있습니다. 이에 대응하는 HttpApplication 개체의 EndRequest 이벤트(Application_EndRequest)를 사용하면 요청에 사용된 리소스를 닫거나 삭제할 수 있습니다.

  • StartEnd 이벤트가 있다는 점에서 세션 이벤트는 응용 프로그램 이벤트와 유사하지만 응용 프로그램 내의 각 고유 세션에서 발생합니다. 세션은 사용자가 응용 프로그램에 처음으로 페이지를 요청할 때 시작되고 응용 프로그램에서 세션을 명시적으로 닫거나 세션 제한 시간이 종료되면 끝납니다.

    참고:

    Session_End 이벤트는 어떤 경우에도 발생하지 않습니다. 자세한 내용은 End를 참조하십시오.

Global.asax 파일에서 이러한 이벤트 형식에 대한 처리기를 작성할 수 있습니다. 자세한 내용은 IIS 5.0 및 6.0의 ASP.NET 응용 프로그램 수명 주기 개요Global.asax 구문을 참조하십시오.

참고 항목

개념

ASP.NET 상태 관리 개요

기타 리소스

방법: ASP.NET 웹 페이지에서 이벤트 처리기 만들기

ASP.NET 웹 페이지에서 서버 이벤트 처리