다음을 통해 공유


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

ASP.NET 서버 컨트롤에 의해 발생된 이벤트는 기존의 클라이언트 폼이나 클라이언트 기반 웹 응용 프로그램의 이벤트와는 약간 다른 방식으로 작동합니다. 차이점은 주로 이벤트가 처리되는 위치와 이벤트 사이를 분리함으로써 발생합니다.

클라이언트 기반 응용 프로그램에서 이벤트는 클라이언트에서 발생하고 처리됩니다. 한편 Web Forms 페이지에서 서버 컨트롤과 연결된 이벤트는 클라이언트에서 발생하지만 ASP.NET 페이지 프레임워크에 의해 웹 서버에서 처리됩니다.

클라이언트에서 발생하는 이벤트의 경우 Web Forms 컨트롤 이벤트 모델에서 이벤트 정보는 클라이언트에서 캡처되고 이벤트 메시지는 HTTP 게시를 통해 서버로 전송되어야 합니다. 페이지 프레임워크는 게시를 해석하여 어떤 이벤트가 발생했는지 확인하고 서버의 코드에서 적절한 메서드를 호출하여 이벤트를 처리해야 합니다. 자세한 내용은 ASP.NET 서버 컨트롤의 이벤트를 참조하십시오.

Web Forms 컨트롤 이벤트 모델

ASP.NET은 이벤트를 캡처, 전송 및 해석하는 거의 모든 단계를 처리합니다. Web Forms 페이지에서 이벤트 처리기를 만들면 이벤트 정보를 어떻게 캡처하여 코드에서 사용할 수 있게 할 것인지에 관해 신경 쓸 필요가 없습니다. 대신 기존의 클라이언트 폼에서와 같은 방법으로 이벤트 처리기를 만들 수 있습니다. 그렇다 하더라도 Web Forms 페이지에서 이벤트를 처리할 때 유의해야 할 점이 몇 가지 있습니다.

내장 이벤트 집합

대부분의 Web Forms 이벤트는 처리를 위해 서버로 라운드트립되어야 하므로 폼의 성능에 영향을 미칠 수 있습니다. 따라서 서버 컨트롤은 주로 클릭 형식의 이벤트로만 한정된 제한적인 내장 이벤트 집합을 제공합니다. 일부 서버 컨트롤은 컨트롤 값이 변경될 때 발생하는 특수한 onchange 이벤트 버전을 지원합니다. 예를 들어, CheckBox 웹 서버 컨트롤에서는 사용자가 확인란을 클릭할 경우 변경 이벤트가 발생합니다. onmouseover 이벤트와 같이 사용자가 모르게 자주 발생하는 이벤트는 서버 컨트롤에서 지원되지 않습니다.

**참고   **일부 서버 컨트롤에서는 고급 이벤트 집합을 지원합니다. 예를 들어, Calendar 웹 서버 컨트롤에서는 Click 이벤트를 좀 더 추상화한 버전인 SelectionChanged 이벤트가 발생합니다.

이벤트 인수

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

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

웹 서버 컨트롤에서 클릭 이벤트와 같은 특정 이벤트가 발생하면 폼이 서버에 다시 게시됩니다. HTML 서버 컨트롤이나 TextBox 컨트롤과 같은 웹 서버 컨트롤에서 변경 이벤트가 발생하면 이벤트는 캡처되지만 곧바로 게시되지는 않습니다. 대신 이러한 이벤트는 다음 게시가 발생할 때까지 컨트롤에서 캐싱합니다. 나중에 서버에서 페이지가 다시 처리될 때 이렇게 보류된 모든 이벤트가 발생되고 처리됩니다.

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

서버 페이지를 처리하는 동안 이벤트는 특정한 순서 없이 먼저 처리됩니다. 변경 이벤트가 모두 처리되고 나면 폼이 게시되도록 만든 클릭 이벤트가 처리됩니다.

**참고   **페이지 이벤트 처리에 관해 자세히 알고 있지 않은 경우에는 특정 순서로 발생하는 변경 이벤트를 사용하는 응용 프로그램 논리를 만들어서는 안됩니다. 자세한 내용은 게시 이벤트 샘플을 참조하십시오.

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

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

버블 이벤트

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

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

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

참고   DataGridDataList 웹 서버 컨트롤은 특수한 버블 이벤트인 EditCommand, DeleteCommandUpdateCommand와 같은 추가 이벤트를 지원합니다.

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

Web Forms 페이지의 이벤트 대리자

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

Web Forms 페이지에서는 대개 명시적으로 대리자를 코딩할 필요가 없습니다. Visual Studio의 Web Forms 디자이너에서 디자이너는 이벤트를 자동으로 메서드에 바인딩하는 코드를 생성합니다. Visual Basic의 경우, 다음 예제와 같이 이벤트 처리기 선언의 Handles 키워드를 사용하여 바인딩이 수행됩니다.

Private Sub Page_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

Visual C#의 경우, 다음과 같이 페이지에 명시적 이벤트 처리기 대리자를 디자이너에서 생성합니다.

private void InitializeComponent()
{   
   this.Load += new System.EventHandler(this.Page_Load);
}

또는 ASP.NET 페이지 프레임워크에서 페이지 이벤트와 메서드를 연결하는 자동 방법을 지원합니다. Page 지시문의 AutoEventWireup 특성이 true로 설정되거나 기본값이 true이므로 생략된 경우 페이지 프레임워크에서 페이지 이벤트 특히, Page_InitPage_Load 메서드를 자동으로 호출합니다. 이 경우 명시적 Handles 절이나 대리자는 필요하지 않습니다.

AutoEventWireup 특성의 단점은 페이지 이벤트 처리기에 미리 예측할 수 있는 이름이 필요하다는 것입니다. 그 결과 이벤트 처리기의 이름을 지정하는 데 있어 유연성이 제한됩니다. 따라서 Visual Studio에서 AutoEventWireup 특성은 기본적으로 false로 설정되고 디자이너에서 페이지 이벤트를 메서드에 바인딩하는 명시적 코드를 생성합니다.

AutoEventWireuptrue로 설정하면 Visual Studio에서 이벤트를 바인딩하는 코드를 생성하고 페이지 프레임워크에서 그 이름을 기준으로 자동으로 이벤트를 호출합니다. 그 결과 페이지를 실행하면 같은 이벤트 코드가 두 번 호출될 수 있습니다. 따라서 Visual Studio에서 작업할 때는 항상 AutoEventWireupfalse로 설정해야 합니다.

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

대부분의 경우 서버 코드에서 발생하는 이벤트에 관심을 갖게 됩니다. 그러나 응용 프로그램에 적합한 경우에는 클라이언트 스크립트를 작성하여 ASP.NET 서버 컨트롤의 클라이언트측 이벤트를 처리할 수도 있습니다.

참고   웹 서버 컨트롤의 경우 HTML 구문을 사용하여 클라이언트측 이벤트에 바인딩할 수 없습니다. 대신 코드에 이벤트 바인딩 특성을 추가해야 합니다. 자세한 예는 다음 표를 참조하십시오.

예를 들어, HTML 서버 컨트롤로 변환한 HTML 이미지 단추 요소가 있을 수 있습니다. 일반적으로 Web Forms 페이지에서는 이미지 단추의 클릭 이벤트를 서버 코드에서 처리합니다. 그러나 사용자가 마우스를 이미지 위로 이동할 경우 이미지를 변경하기 위해 클라이언트 코드를 사용할 수도 있습니다. 즉, 이미지 단추의 onmouseover 이벤트에 대한 클라이언트 스크립트를 작성하면 됩니다. 이 예제에서는 Microsoft Internet Explorer 4.0 이상과 같이 HTML 4.0을 지원하는 브라우저를 사용하는 것으로 가정합니다.

**참고   **클라이언트측 이벤트 처리기와 서버측 이벤트 처리기의 이름이 같은 경우에는 항상 클라이언트측 이벤트 처리기가 먼저 실행된 다음 서버측 이벤트 처리기가 실행됩니다. 그러나 두 이벤트 처리기의 이름이 같으면 혼동이 생길 수 있으므로 명명 규칙 계획을 세우는 것이 좋습니다.

클라이언트 코드와 서버 코드의 클릭 이벤트 처리

클라이언트와 서버측에서 모두 처리하기가 어려운 이벤트로 onclick 이벤트가 있습니다. 이러한 문제는 모든 단추 서버 컨트롤과 AutoPostBack 속성이 true로 설정된 다른 컨트롤이 서버로 페이지를 전송하기 때문에 발생합니다. 그러나 HTML에서는 소수의 컨트롤만 폼을 전송합니다.

  • 해당 형식이 Submit 또는 Image로 설정된 HTML 전송 단추(<INPUT type=submit>)인 HtmlInputButton 컨트롤. 이 컨트롤은 도구 상자의 HTML 탭에서 추가할 수 있습니다.
  • Button 웹 서버 컨트롤(<asp:button>)

페이지를 전송하도록 지정된 다른 모든 컨트롤의 경우 작은 클라이언트 스크립트가 페이지에 추가되어 컨트롤을 클릭할 때 폼을 전송하도록 호출됩니다. 따라서 이러한 컨트롤은 이미 클라이언트측 OnClick 이벤트를 사용하여 이 전송 스크립트를 호출합니다.

모든 컨트롤에 대해 클라이언트측 OnClick 처리기를 작성할 수 있지만 각 컨트롤 형식별로 사용할 수 있는 방법을 선택해야 합니다. 다음 표에는 여러 형식의 컨트롤에 사용할 수 있는 방법이 요약되어 있습니다.

컨트롤 방법
형식이 Submit, Reset 또는 Image인 HTML 서버 컨트롤 단추를 포함하는 HtmlInputButton 컨트롤의 HTML 구문에 onclick 특성을 포함합니다.
<INPUT Type="Submit" Runat="Server" Value="caption" onclick="clientfunction()"  ...>

서버측에서 이 단추 유형은 간단한 Click 이벤트 대신 ServerClick 이벤트를 발생시킵니다. 클라이언트 이벤트가 먼저 발생한 다음 폼이 전송되고 서버 이벤트가 처리됩니다.

기본적으로 폼을 전송하지 않는 기타 모든 HTML 컨트롤 컨트롤의 HTML 구문에 onclick 특성을 포함하지만 뒤에 세미콜론(;)이 추가됩니다.
<INPUT Type="Button" Runat="Server" Value="caption" onclick="clientfunction();"  ...>

따라서 클라이언트측 전송 스크립트를 호출하기 전에 함수를 먼저 호출해야 합니다.

단추(<asp:button>)와 기타 컨트롤(예: <asp:checkbox>)을 포함하는 웹 서버 컨트롤 웹 서버 컨트롤의 경우 HTML 구문에서 클라이언트측 이벤트를 지정할 수 없습니다. 대신 서버 코드에 다음과 같은 코드를 사용하여 런타임에 이벤트 특성을 컨트롤에 추가합니다.
Button1.Attributes.Add("onclick", "clientfunction();")
참고   Button 웹 서버 컨트롤의 경우 컨트롤이 자동으로 페이지를 전송하므로 세미콜론이 필요 없습니다.

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

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

  • 응용 프로그램 이벤트는 응용 프로그램에 대한 모든 요청에 대해 발생합니다. 예를 들어, Application_BeginRequest는 응용 프로그램에서 Web Forms 페이지나 XML Web services를 요청할 경우 발생합니다. 이 이벤트를 사용하면 응용 프로그램에 대한 각 요청에 사용될 리소스를 초기화할 수 있습니다. 이에 대응하는 Application_EndRequest 이벤트를 사용하면 요청에 사용된 리소스를 닫거나 삭제할 수 있습니다.
  • Session_StartSession_End 이벤트가 있다는 점에서 세션 이벤트는 응용 프로그램 이벤트와 유사하지만 응용 프로그램 내의 각 고유 세션에서 발생합니다. 세션은 사용자가 응용 프로그램에 처음으로 페이지를 요청할 때 시작되고 응용 프로그램에서 세션을 명시적으로 닫거나 세션 제한 시간이 종료되면 끝납니다.

Global.asax 파일에서 이러한 이벤트 형식에 대한 처리기를 작성할 수 있습니다. 자세한 내용은 Global.asax 파일Global.asax 구문을 참조하십시오.

참고 항목

Web Forms 페이지에서 서버 이벤트 처리 | Global.asax 파일 | Web Forms 상태 관리 소개 | HttpApplication 인스턴스로 작업