이전 기사에서는 사용자 정의 서버 제어 이벤트 구현의 기본 개념을 소개했습니다. 이 문서에서는 일반적인 예를 통해 콜백 이벤트를 캡처하는 방법을 설명합니다.
1. 포스트백 이벤트 캡처를 구현합니다.
서버 컨트롤이 클라이언트에서 포스트백 이벤트를 캡처해야 하고 포스트백 이벤트에 대한 서버측 이벤트 처리 논리를 사용자 지정하려는 경우 컨트롤은 System.Web.UI.IPostBackEventHandler 인터페이스를 구현해야 합니다. 인터페이스 정의는 다음과 같습니다.
공용 인터페이스 IPostBackEventHandler
{
void raisePostBackEvent(string eventArgument);
}
위 코드에서 볼 수 있듯이 IPostBackEventHandler 인터페이스에는 하나의 멤버 메서드인 raisePostBackEvent만 포함됩니다. 이 메서드를 사용하면 서버 컨트롤에서 양식이 서버로 전송될 때 발생하는 이벤트를 처리할 수 있습니다. 해당 매개 변수 eventArgument는 이벤트 처리기에 전달될 선택적 이벤트 매개 변수를 나타냅니다. 개발자는 서버 제어 포스트백 프로세스 중에 수행되는 논리를 raisePostBackEvent 메서드에서 구현할 수 있습니다. 일반적으로 raisePostBackEvent 메서드는 하나 이상의 서버측 이벤트를 발생시킵니다. 다음 코드 조각은 서버에서 Click 이벤트를 발생시키는 raisePostBackEvent 구현을 보여줍니다.
공공 무효 raisePostBackEvent(문자열 eventArgument)
{
OnClick(EventArgs.Empty);
}
포스트백 이벤트를 캡처하려면 서버 컨트롤 클래스에서 IPostBackEventHandler 인터페이스를 구현하고 이 인터페이스의 멤버 메서드를 구현하는 것만으로는 충분하지 않습니다. 개발자는 다른 것의 구현에도 주의를 기울여야 합니다. 아래에는 포스트백 이벤트를 캡처하는 과정에서 세 가지 핵심 사항이 나열되어 있습니다.
첫째, 가장 중요한 것은 사용자 지정 서버 컨트롤 클래스가 IPostBackEventHandler 인터페이스를 구현하고 인터페이스 멤버인 raisePostBackEvent 메서드를 구현해야 한다는 것입니다. 이 프로세스는 위에서 설명되었습니다.
둘째, 컨트롤에 UniqueID를 할당합니다.
포스트백 이벤트를 UniqueID로 만드는 컨트롤의 name 특성 값을 정의하는 것은 raisePostBackEvent 메서드를 올바르게 구현하는 데 중요한 요소 중 하나입니다. 포스트백이 트리거되면 페이지 프레임워크는 전송되는 콘텐츠를 검색하고 전송 개체의 이름이 IPostBackEventHandler를 구현하는 서버 컨트롤의 UniqueID에 해당하는지 확인합니다. 해당하는 경우 페이지 프레임워크는 컨트롤에서 raisePostBackEvent 메서드를 호출합니다. 여기서 중요한 점은 개발자가 렌더링 논리에서 컨트롤의 이름 특성에 UniqueID를 할당해야 한다는 것입니다. 간단한 코드 예제가 아래에 나열되어 있습니다.
보호된 재정의 무효 렌더링(HtmlTextWriter 출력)
{
output.Write("<INPUT TYPE=제출 이름="+this.UniqueID+"Value='클릭하세요' />");
}
위 코드에서 볼 수 있듯이 컨트롤 렌더링 메서드 Render에는 name 속성 값이 UniqueID인 버튼이 표시됩니다. 포스트백을 발생시키는 컨트롤의 이름 특성에 UniqueID가 할당된 경우에만 포스트백 이벤트가 올바르게 캡처될 수 있습니다.
셋째, 이벤트 속성 구조를 구현합니다.
이벤트 속성 구조는 이벤트를 구현하는 최적화된 방법입니다. 소개하기 전에 먼저 일반적인 제어 이벤트 구현 방법을 살펴보겠습니다. 구체적인 코드는 다음과 같습니다.
...
공용 클래스 WebCustomControl:WebControl,IPostBackEventHandler{
//클릭 이벤트 대리자 공개 이벤트 선언 EventHandler Click;
//RaisePostBackEvent 메서드 구현 void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) {
OnClick(EventArgs.Empty);
}
//OnClick 이벤트 핸들러 정의 protected virtual void OnClick(EventArgs e) {
if(클릭!= null) { 클릭(이것,e) }
}
...
}
위 코드에는 이벤트 정의와 관련된 세 가지 핵심 내용이 포함되어 있습니다. 1. Click 이벤트 대리자를 정의합니다. 2. 컨트롤 클래스는 IPostBackEventHandler 인터페이스를 구현하며, 여기서 인터페이스 멤버 메서드인 raisePostBackEvent를 구현할 때 이벤트 핸들러 OnClick이 정의됩니다. ;3. OnClick 이벤트 핸들러를 구현합니다. 위의 구현 방법은 간단하고 사용하기 쉽지만 실행 효율성이 낮다는 단점이 있습니다. 특히, 한 클래스 내에서 여러 개의 이벤트가 발생하게 되면 오버헤드가 증가하고 서버 자원이 많이 낭비되어 결국 운영 효율성이 저하됩니다.
위와 같은 문제를 해결하기 위해 최적화된 이벤트 구현 방법-이벤트 속성 구조를 아래와 같이 소개한다. 이 구조는 간단한 대리자 목록을 제공하는 System.ComponentModel.EventHandlerList 클래스를 사용합니다. 개발자는 이 클래스에서 제공하는 관련 메서드를 사용하여 컨트롤의 이벤트 처리기 대리자 목록을 유연하게 조작할 수 있습니다. 예를 들어 컨트롤의 Click 이벤트는 다음과 같은 이벤트 특성 구조를 사용합니다.
protected static readonly object EventClick = new object();
공개 이벤트 EventHandler 클릭{
추가하다 {
Events.AddHandler(EventClick,value);
}
제거하다 {
Events.RemoveHandler(EventClick,value);
}
}
이벤트 속성 구조를 정의하기 전에 먼저 Click 이벤트 대리자 개체를 정의해야 합니다. 각 이벤트는 한 번만 생성되므로 정적 및 읽기 전용으로 선언해야 합니다. 그런 다음 속성 구조의 AddHandler 및 RemoveHandler 메서드를 통해 이벤트 처리기 대리자 목록을 작동합니다. 페이지가 Click 이벤트를 호출하면 컨트롤의 EventHandlerList 컬렉션에서 처리기를 추가하거나 제거합니다. 이 구현 방법은 여러 이벤트의 선언 과정에서 일반적인 구현 방법보다 효율적이므로 매우 권장되는 방법입니다.
또한 OnClick 메서드를 구현하는 동안 이벤트 특성을 사용할 때 EventHandlerList에서 대리자를 검색하고 EventHandler 유형으로 변환해야 합니다.
보호된 가상 무효 OnClick(EventArgs e){
EventHandler clickHandler = (EventHandler)이벤트[EventClick];
if(clickHandler != null) {
clickHandler(this,e);
}
}
독자 주의 사항: 이벤트 속성 구조는 VB.NET 언어에는 적용되지 않으며 C#과 같은 언어에만 적용할 수 있습니다.
2. 일반적인 응용 분야
솔직히 말해서 포스트백 이벤트 캡처에 대한 위의 이론적 소개는 서버 제어 이벤트를 구현해 본 적이 없는 독자에게는 다소 이해하기 어렵습니다. 이를 위해 이 섹션에서는 일반적인 예를 사용하여 반환 이벤트를 캡처하는 구현 방법을 구체적으로 설명합니다.
이 예제에서는 사용자 지정 서버 컨트롤 WebCustomControl을 구현합니다. 이 컨트롤은 버튼으로 표시되지만 Button 클래스에서 상속되지는 않습니다. 버튼을 클릭하면 컨트롤이 포스트백을 일으키고 서버는 반환된 클릭 이벤트를 자동으로 캡처하고 Click 이벤트를 트리거하며 해당 이벤트 핸들러를 실행합니다. 다음은 서버 제어 구현의 소스 코드입니다.
시스템 사용; System.Collections.Generic을 사용합니다. System.ComponentModel 사용; System.Text 사용; System.Web 사용; System.Web.UI 사용; System.Web.UI.WebControls 사용; 네임스페이스 WebControlLibrary{ [DefaultEvent("클릭")] [ToolboxData("<{0}:WebCustomControl runat=server></{0}:WebCustomControl>")] 공용 클래스 WebCustomControl : WebControl, IPostBackEventHandler { //Click 이벤트 대리자 객체 정의 private static readonly 객체 EventClick = new object(); //클릭 이벤트 속성 구현 [Description("클릭 이벤트 속성"), Category("Action") ] 공개 이벤트 EventHandler 클릭 { 추가하다 { Events.AddHandler(EventClick, value); } 제거하다 { Events.RemoveHandler(EventClick, value); } } // 컨트롤 렌더링 메서드 RenderContents를 재정의합니다. 보호된 재정의 void RenderContents(HtmlTextWriter 출력) { output.Write("<input type='submit' name=" + this.UniqueID + " value=클릭하세요/>"); } //이벤트 메소드 보호 virtual void OnClick(EventArgs e) { EventHandler clickHandler = (EventHandler)이벤트[EventClick]; if (clickHandler != null) { clickHandler(this, e); } } // IPostBackEventHandler 인터페이스 멤버 구현 void IPostBackEventHandler.RaisePostBackEvent(string eventArgument) { OnClick(EventArgs.Empty); } } } |
<%@ 페이지 언어="C#" AutoEventWireup="true" CodeFile="Default.aspx.cs" Inherits="_Default" %> <%@ TagPrefix="cc" Namespace="WebControlLibrary" Assembly="WebControlLibrary" %> 등록 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <스크립트 runat="서버"> void wcc1_Click(객체 전송자, EventArgs e) { message.Text = "위 버튼을 클릭하셨습니다."; } </script> <html xmlns="http://www.w3.org/1999/xhtml"> <head runat="서버"> <title>포스트백 이벤트 캡처</title> </head> <본문> <form id="form1" runat="서버"> <중앙> <cc:WebCustomControl ID="wcc1" runat="server" OnClick="wcc1_Click" /> <br /> <br /> <asp:Label ID="message" runat="server"></asp:Label> </center> </form> </body> </html> |
그림 1 페이지 초기화 렌더링 그림 2 버튼 클릭 후 효과 |
//AutoPostBack 속성 정의 공공 bool AutoPostBack{ 세트 { this._autoPostBack = 값; } 얻다 { this._autoPostBack을 반환합니다. } } //Render 메서드에 Page.GetPostBackEventReference() 메서드를 추가합니다. 보호된 재정의 void Render(HtmlTextWriter 출력){ ... if(this.AutoPostBack) { writer.WriteAttribute("ontextchanged","javascript:" + Page.GetPostBackEventReference(this)); } ... } |