'서버컨트롤'에 해당되는 글 2건

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
Programming/.NET
ASP.NET에서 컨트롤은 HTML컨트롤과 웹서버 컨트롤로 나뉩니다. HTML 컨트롤은 HTML의 특징적 요소들을 그대로 사용하며 id와 runat="server" 속성을 부여하면 attribute 속성을 통해 HTML 컨트롤의 속성을 제어할 수 있습니다.

서버컨트롤을 사용하는 경우 이를 HTML로 렌더링하기 위해 별도의 컴파일과정을 거쳐야 하지만 HTML은 그 과정등이 생략되므로(물론 여러이유중 하나이지만) 속도면에서는 HTML 컨트롤이 더 빠를 수 있습니다.

반면 WebControl이나 Control 클래스에서 파생되는 몇몇 서버컨트롤은 단순한 HTML과는 정확히 대응하지 않지만 대신 서버의 처리를 거치면서 만들어지는 결과페이지에 특정 HTML로 렌더링됩니다. 이때 ASP.NET 만의 한가지 독특한 점은 페이지를 요청한 사용자의 웹브라우저및 버전등을 HTTP User Agent 헤더로 판단하여 그에 맞는 최적화된 HTML요소로 변환해 준다는 것입니다.

이는 모두다 같은 HTML이 아닌 브라우저 마다 요구될 수 있는 최적의 결과를 표시할 수 있도록 ASP.NET이 자동으로 알아서 처리해 주므로 개발자에겐 매우 편리한 부분이라 생각됩니다.

서버컨트롤은 각기 용도가 다르고 개성이 다르지만 아래와 같이 공통적으로 적용할 수 있는 몇가지 속성이 존재합니다.

 AccessKey  해당 컨트롤에 접근하는 단축키를 설정할 수 있습니다. AccessKey="B" 와 같이 설정하며 Alt + B 키를 누르면 해당 컨트롤의 기본적인 동작(예를 들어 Button의 경우 Click)이 수행됩니다.
 TabIndex  컨트롤에 탭키로 이동할 수 있는 순서를 배정합니다.
 BackColor  컨트롤의 배경 색상을 지정합니다.
 BorderColor  컨트롤의 테두리 색상을 지정합니다.
 BorderWidth  컨트롤의 테두리 두께를 지정합니다.
 BorderStyle  컨트롤의 테두리 스타일을 지정합니다.
 ClientIDMode  ClientID 속성값이 설정되는 형태를 지정합니다.
 CssClass  외부 파일이나 내부에서 클래스 형태로 정의된 CSS 클래스를 컨트롤에 적용합니다.
 Style  컨트롤에 CSS 스타일을 지정합니다.
 Enable  컨트롤의 사용 여부를 지정합니다.
 EnableViewState  컨트롤에 ViewState 사용여부를 지정합니다.
 Font  컨트롤의 글꼴을 지정합니다.
 ForeColor  컨트롤의 표시문자열 색상을 지정합니다.
 Height  컨트롤의 높이를 설정합니다.
 Width  컨트롤의 넓이를 설정합니다.
 EnableTheming  컨트롤의 테마 적용 여부를 설정합니다.
 SkinID  컨트롤에 테마적용시 사용할 스킨ID를 설정합니다.
 ToolTip  컨트롤에 ToolTip(풍선도움말)을 설정합니다.

참고로 ASP.NET 4 부터는 컨트롤을 최대한 최근 HTML 표준에 맞도록 렌더링 하고 있습니다. 이를 테면 어떤 컨트롤에 Enable 속성을 부여하여 컨트롤 사용을 금지시킨 경우 이 컨트롤을 HTML로 렌더링 할때는 다음과 같이 해당 기능이 작동되도록 속성이 부여되고 있습니다.
<asp:TextBox ID="TextBox1" runat="server" Enabled="false"></asp:TextBox>
▶Enable 속성 지정
<input name="TextBox1" type="text" id="TextBox1" disabled="disabled" class="aspNetDisabled" />
▶ HTML 렌더링결과

부여된 속성중 disabled="disabled" 부분은 더이상 HTML 표준에 맞지 않는 속성이지만 그 뒤에 이어진 class="aspNetDisabled"에서는 CSS 의 클래스를 통해 관련 기능을 구현함으로서 기존의 방식과 최근의 표준에 맞는 방법을 동시에 나타내고 있습니다. 물론 관련 CSS 클래스는 직접 구현해야 하는 것이지만 만약 해당 CSS 클래스 이름을 다른것으로 해야 한다면 Application_Start 에서 다음과 같이 처리할 수도 있습니다.
void Application_Start(object sender, EventArgs e)
{
    WebControl.DisabledCssClass = "임의 클래스 이름";
}
다만 Web.Config 의 pages 요소에
<pages controlRenderingCompatibilityVersion="3.5">
처럼 controlRenderingCompatibilityVersion 속성을 3.5로 하면 기존에 구현하던 방식(disabled="disabled"과 같은)만 나타날 뿐 HTML 표준속성(class="aspNetDisabled" 처럼)은 더이상 구현되지 않도록 제어할 수 있습니다.

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

[ASP.NET] Chart  (0) 2014.01.27
[ASP.NET] BulletedList  (0) 2014.01.23
[ASP.NET] 서버컨트롤 (Server Controls)  (0) 2014.01.21
[ASP.NET] FileUpload  (2) 2014.01.20
[ASP.NET] DropDownList  (0) 2014.01.16
[ASP.NET] XML (컨트롤)  (0) 2014.01.15
0 0
1
블로그 이미지

클리엘