Programming/.NET

사용자 정의 컨트롤(이하 ascx : 사용자 정의 컨트롤 확장자)은 여러 서버컨트롤을 묶어 하나의 컨트롤로서 생성할 수 있는 방법을 제공합니다.

 

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" 

Inherits="web_form_test.WebUserControl1" %>

 

ascx는 Page대신 Control 지시자가 사용됩니다. 다른 페이지에 존재하는 HTML이나 서버태그(Form)과 같은 요소는 없습니다. ascx는 단독적으로 실행하는것이 아닌 페이지안에 포함되어 실행되는 형태이기 때문에 이미 페이지에 존재하는 태그요소들을 또 다시 ascx에서 포함할 필요가 없기 때문입니다.

 

public partial class WebUserControl1 : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

 

ascx도 일반 Page처럼 Load와 같은 페이지 실행 이벤트가 존재하며 ascx내부에 존재하는 다른 컨트롤의 이벤트또한 처리할 수 있습니다. 아래는 ascx에 있는 버튼클릭 이벤트를 표시하는 예제입니다.

 

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs" 

Inherits="web_form_test.WebUserControl1" %>
<asp:Button ID="Button1" runat="server" Text="Button" OnClick="Button1_Click" />

 

public partial class WebUserControl1 : System.Web.UI.UserControl
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        Response.Write("cliel");
    }
}

 

ascx를 페이지안에 배치(포함)시킬때는 원하는 위치에 마우스로 끌어다 놓으면 됩니다.

 

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" 

Inherits="web_form_test.Default"%>

<%@ Register Src="~/WebUserControl1.ascx" TagPrefix="uc1" TagName="WebUserControl1" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <uc1:webusercontrol1 runat="server" id="WebUserControl1" />
    </div>
    </form>
</body>
</html>

 

코드를 통해 수동으로 ascx를 배치하려면 배치하려는 위치의 aspx페이지 컨트롤을 찾아 해당 컨트롤에 ascx를 추가해야 합니다.

 

Control cForm = Page.FindControl("Form1");
Control cMy = LoadControl("WebUserControl1.ascx");

cForm.Controls.Add(cMy);

 

일단 ascx를 로드하면 ascx의 id속성에 지정된 값으로 해당 컨트롤의 속성에 접근이 가능합니다. 다만 코드로 ascx를 로드한 경우 해당 ascx를 본래의 형식으로 캐스팅해야 합니다.

 

Control cForm = Page.FindControl("Form1");
WebUserControl1 cMy = (WebUserControl1)LoadControl("WebUserControl1.ascx");

cForm.Controls.Add(cMy);

cMy.ID = "myControl";

 

그런데 만약 ascx에 출력캐시가 적용된 경우에는 LoadControl 메소드에서 본래 형식의 타입대신 PartialCachingControl형식을 반환하게 됩니다. 따라서 위 예제에서처럼 무작정 WebUserControl1처럼 캐스팅하려고 시도하면 예외가 발생합니다.

 

Control cForm = Page.FindControl("Form1");
Control cMy = LoadControl("WebUserControl1.ascx");

cForm.Controls.Add(cMy);

WebUserControl1 wuc;

if (cMy is WebUserControl1) {
    wuc = cMy as WebUserControl1;
    wuc.ID = "myControl";
}
else if ((cMy is PartialCachingControl) && (cMy as PartialCachingControl).CachedControl != null) {
    wuc = (WebUserControl1)((PartialCachingControl)cMy).CachedControl;
    wuc.ID = "myControl";
}

 

위 예제는 출력캐시의 문제를 해결하기 위한 것으로 컨트롤의 타입이 WebUserControl1처럼 본래 ascx와 동일한 형식일 경우에는 기존 형식대로 잘 캐시팅된 것이라고 판단할 수 있지만 그렇지 않고 ascx가 PartialCachingControl 형식이라면 이것은 캐시된 컨트롤임을 의미하게 되고 따라서 CachedControl 속성을 통해 캐시된 컨트롤을 가져와 다시 WebUserControl1과 같은 본래형식으로 변환한 후 해당 개체에 접근해야 합니다.

'Programming > .NET' 카테고리의 다른 글

[ASP.NET] 서버 컨트롤 - 1 (기본생성)  (0) 2016.08.01
[ASP.NET] ListView  (0) 2016.07.27
[ASP.NET] 사용자 정의 컨트롤  (0) 2016.07.21
[ASP.NET] 가장 (impersonation)  (0) 2016.07.12
[ASP.NET] ADO.NET 의 비동기 처리  (0) 2016.07.05
[C#] FtpWebRequest / FtpWebResponse  (0) 2016.06.29
0 0