Programming/.NET

서버 컨트롤에서 페이지에 포스트백 이벤트를 발생시키려면 우선 GetPosBackEventReference 메소드를 사용해 클라이언트에 포스트백을 일으키는 스크립트를 생성해야 합니다.

 

protected override void RenderContents(HtmlTextWriter output)
{
    PostBackOptions pbo = new PostBackOptions(this);
    output.AddAttribute(HtmlTextWriterAttribute.Onclick, Page.ClientScript.GetPostBackEventReference(pbo));

    output.AddAttribute(HtmlTextWriterAttribute.Id, "btn_" + this.ClientID);
    output.RenderBeginTag(HtmlTextWriterTag.Button);
    output.Write("Button");
    output.RenderEndTag();
}

 

PostBackOptions는 포스트백을 발생시킬때 사용가능한 옵션을 설정합니다. 지금은 아무것도 필요하지 않으므로 객체만 생성하고 GetPostBackEventReference 메소드에 해당 객체를 전달하도록 합니다.

 

예제에서는 버튼에 포스트백을 걸어놓았는데 버튼을 눌렀을때 실제 이벤트를 처리하려면 우선 IPostBackEventHandler 인터페이스를 상속받아

 

public class WebCustomControl1 : WebControl, IPostBackEventHandler

 

RaisePostBackEvent 메소드를 작성합니다.

 

public void RaisePostBackEvent(string sender)
{

}

 

RaisePostBackEvent 메소드는 버튼을 눌렀을때 실제 호출되는 메소드인데 해당 메소드를 통해서 원하는 이벤트를 호출하는 것입니다.

 

private EventHandler _click; 
public event EventHandler Click 
{ 
    add { _click += value; } 
    remove { _click -= value; }
}

 

호출될 이벤트를 서버 컨트롤과 연결시키기 위해 서버컨트롤에서 Click 속성을 생성하고 _click 이벤트 핸들러에 속성으로 전달되는 이벤트를 연결시키도록 합니다.

 

protected virtual void OnClickEvent()
{ 
    if (_click != null) 
        _click(this, new EventArgs()); 
}

 

_click에 연결된 이벤트는 OnClickEvent 가상메소드에 의해 호출되도록 하며

 

public void RaisePostBackEvent(string sender)
{
    OnClickEvent();
}

 

이 가상 메소드는 이전에 IPostBackEventHandler 인터페이스로 구현된 RaisePostBackEvent 메소드에서 호출될것입니다.

 

이제 서버 컨트롤에서의 준비는 끝났으므로 서버 컨트롤이 사용되는 페이지에서 서버컨트롤의 Click이벤트를 연결하고

 

protected void Page_Load(object sender, EventArgs e)
{
    myControl.Click += MyControl_Click;
}

 

해당 이벤트의 메소드를 작성합니다.

 

private void MyControl_Click(object sender, EventArgs e)
{
    Response.Write("aaa");
}

 

페이지를 실행하고 서버 컨트롤에서 생성된 Button을 클릭하면 자연스럽게 페이지에 작성된 MyControl_Click 메소드가 호출될 것입니다.

 

뿐만 아니라 서버 컨트롤에서는 페이지에서 포스트백이 발생할때 서버로 전송되는 데이터를 받아오는 것도 가능합니다.

 

public class WebCustomControl1 : WebControl, IPostBackDataHandler

 

포스트백 데이터를 받아오기 위해서는 IPostBackDataHandler 인터페이스를 구현해야 합니다.

 

public bool LoadPostData(string postDataKey, NameValueCollection postCollection)
{
    Text = postCollection["TextBox1"];
    return false;
}

public void RaisePostDataChangedEvent()
{
}

 

IPostBackDataHandler 인터페이스는 LoadPostData와 RaisePostDataChangedEvent메소드를 구현해야 합니다. 페이지에서는 포스트백이 발생하면 서버 컨트롤의 LoadPostData메소드를 호출하여 서버로 전송되는 데이터를 NameValueCollection 에 담아 전송해주게 됩니다.

 

LoadPostData 메소드에서는 TextBox1의 입력값을 받아오기 위해 키를 TextBox1로 지정했는데 자기 자신의 포스트백데이터를 받아오려면 postDataKey를 키값으로 지정해 주면 됩니다. 또한 LoadPostData메소드에서는 false를 return값으로 정했는데 만약 이 값을 true로 바꾸면 RaisePostDataChangedEvent메소드를 호출하게 됩니다. 특정 이벤트를 서버 컨트롤에서 발생시켜야 하는 경우 return을 true로 바꾸고 RaisePostDataChangedEvent메소드에 필요한 이벤트를 지정하면 됩니다.

 

protected override void OnInit(EventArgs e)
{
    Page.RegisterRequiresPostBack(this);
}

 

LoadPostData메소드가 정상적으로 호출될 수 있도록 하려면 OnInit 초기화 메소드를 재정의 하여 페이지의 RegisterRequiresPostBack메소드를 등록해야 합니다.

 

<asp:TextBox ID="TextBox1" runat="server"></asp:TextBox>
<cc1:WebCustomControl1 runat="server" ID="myControl" />
<asp:Button Text="Submit" Runat="server" />

 

페이지에는 TextBox와 Button컨트롤을 추가했습니다. Button의 용도는 다른것 없이 오로지 포스트백만을 발생시키기 위한 것입니다.

 

protected void Page_Load(object sender, EventArgs e)
{
    Response.Write(myControl.Text);
}

 

페이지를 실행해 버튼을 클릭하면 서버 컨트롤에서는 LoadPostData메소드를 통해 TextBox1의 값을 가져와 Text속성값으로 지정하게 됩니다. 그리고 페이지의 Load이벤트에 의해 해당 내용이 표시됩니다.

0 0