Programming/.NET

Visual Studio (2015)에서 서버 컨트롤(Server Control)을 생성하려면 프로젝트에서 Add -> New Item을 클릭해 Add New Item 대화상자에서 Web -> Web Form 카테고리에 있는 Web Form Server Control을 선택하면 됩니다.

 

만약 웹 프로젝트가 웹사이트 프로젝트로 생성된것이 아니라면 되도록 서버컨트롤은 아이템을 추가하는 방식이 아닌 새로운 프로젝트로 생성하여 컨트롤을 제작하시기 바랍니다.

 

 

 

생성된 WebCustomControl 클래스를 보면 WebControl 클래스로 부터 파생된 것을 알 수 있는데

 

public class WebCustomControl1 : WebControl

 

WebControl 클래스는 파생되는 클래스에 대해 기본적인 HTML렌더링및 스타일요소를 지원할 수 있도록 합니다. 반면 컨트롤은 ScriptControl클래스로 부터도 파생될 수 있는데 ScriptControl은 WebControl뿐만 아니라 여러 script 라이브러리를 포함시켜 컨트롤을 제작할 수 있게끔 하는 개발영역을 포함하고 있습니다.

 

위와 같은 방법으로 생성된 서버 컨트롤을 페이지가 추가하려면 Register지시자로 서버 컨트롤이 속한 네임스페이스를 등록하고

 

<%@ Register Namespace="web_form_test.App_Code" TagPrefix="cc1" %>

 

Page의 원하는 지점에 TagPrefix로 지정한 접두사로 해당 컨트롤을 생성합니다.

 

<form id="form1" runat="server">
<div>
    <cc1:WebCustomControl1 runat="server" Text="aaa"></cc1:WebCustomControl1>
</div>
</form>

 

위와 같이 Text속성에 aaa라는 값을 지정할 수 있는 이유는 컨트롤에 Text 속성이 존재하며 RenderContents 메소드에 의해 Text값이 출력되었기 때문입니다.

 

사실 RenderContents 메소드는 WebControl의 Render 메소드에서 호출되는데 Render 메소드에서는 하나의 내용을 표시하기 위해 RenderBeginTag, RenderContents, RenderEndTag 세개의 메소드를 순서대로 호출합니다.

 

RenderBeginTag와 RenderEndTag메소드는 RenderContents전후에 배치되어 '<span>'과 같은 내용을 출력내용에 포함시키는데 이 때문에 위 예제의 결과에서 aaa내용 자체를 HTML로 열어 보면 '<span>aaa</span>'과 같이 출력되는 것을 확인할 수 있습니다.

 

이 과정자체는 웹호환성을 최대한 확보하기 위해 구현된 것인데 때로는 이러한 처리가 불편할 수 있습니다. 만약 이 과정이 문제가 되어 해결해야 한다면 Render 메소드를 직접 재정의 해야 합니다.

 

protected override void Render(HtmlTextWriter writer)
{
    this.RenderContents(writer);
}

 

컨트롤의 클래스에 보면 해당 클래스에 적용된 특성을 볼 수 있는데 보통 다음과 같은 형식입니다.

 

[DefaultProperty("Text")]
[ToolboxData("<{0}:WebCustomControl1 runat=server></{0}:WebCustomControl1>")]

 

이 특성들은 컨트롤의 동작이나 도구상자에서 어떻게 표시될지를 지정하는 것이며 보통 다음과 같은 특성들을 사용합니다.

 

 Designer

 해당 컨트롤이 Visual Studio의 디자인모드에서 표시될때 해당 컨트롤에 대한 렌더링을 담당하는 클래스를 지정합니다.

 TypeConverter

 변환하고자 하는 타입을 지정합니다.

 DefaultEvent

 더블클릭을 통해 기본적으로 생성될 이벤트를 지정합니다.

 DefaultProperty

 기본속성을 지정합니다.

 ControlBuilder

 커스텀컨트롤을 구현하기 위한 클래스를 지정합니다.

 ParseChildren

 컨트롤의 태그내부의 XML요소가 속성이나 자식컨트롤로 취급될 수 있는지의 여부를 지정합니다.

 TagPrefix

 사용할 수 있는 접두사를 지정합니다.

 

이번에는 클래스가 아닌 속성을 보겠습니다. 컨트롤의 속성에는 기본으로 Text속성이 지정되어 이 속성에도 다음과 같은 형식의 특성이 존재하며

 

[Bindable(true)]
[Category("Appearance")]
[DefaultValue("")]
[Localizable(true)]

 

아래 특성을 추가적으로 정의할 수 있습니다.

 

 Bindable

 해당 속성의 바인딩여부를 지정합니다.

 Browsble

 해당 속성이 속성창에 표시될지 여부를 지정합니다.

 Category

 해당 속성이 속한 속성범주를 지정합니다.

 Description

 해당 속성에 대한 설명을 작성합니다.

 EditorBrowsable

 해당 속성이 수정가능한지 여부를 지정합니다.

 DefaultValue

 해당 속성의 기본값을 지정합니다.

 NotifyParentProperty

 해당 속성값 수정시 부모 속성이 알릴지 여부를 지정합니다.

 PersistanceMode

 해당 속성이 페이지상에 유지될지를 지정합니다.

 Editor

 해당 속성값을 변경하기 위한 UI편집기를 지정합니다.

 Localizable

 해당 속성의 지역화 여부를 설정합니다.

 Themable

 해당 속성의 테마적용 여부를 지정합니다.

 

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

[ASP.NET] 개인화(Personalization)  (0) 2016.08.16
[ASP.NET] 서버 컨트롤 - 2 (렌더링)  (0) 2016.08.09
[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
0 0