방법: Visual Studio에서 사용자 지정 ASP.NET 서버 컨트롤 사용

Visual Studio 2010

업데이트: 2007년 11월

비주얼 디자이너에서 사용할 적절한 디자인 타임 특성을 정의하면 사용자 지정 서버 컨트롤을 Visual Studio 도구 상자에서 사용할 수 있습니다. 다음 절차에서는 MailLink라는 간단한 컨트롤을 만들어 도구 상자에 포함한 다음 이 컨트롤로 mailto: URL이 있는 하이퍼링크 <a> 요소를 렌더링하여 웹 페이지에 전자 메일 링크를 만듭니다.

디자인 타임 특성이 들어 있는 사용자 지정 컨트롤을 만들려면

  1. Visual Studio에서 라이브러리 프로젝트를 만들고 다음 예제와 같이 WebControl에서 파생되는 사용자 지정 클래스를 정의합니다.

    ms366537.alert_note(ko-kr,VS.100).gif참고:

    전체 소스 코드는 예제 부분에 나와 있습니다.

    <Assembly: TagPrefix("Samples.AspNet", "Sample")> 
    Namespace Samples.AspNet
       < _
        ToolboxData("<{0}:MailLink ID='MailLinkID' Text='WebMaster' runat=""server""> </{0}:MailLink>")> _
        Public Class MailLink
            Inherits WebControl
         ' Custom code goes here.
    End Class
    
    End Namespace
    

    [assembly:TagPrefix("Samples.AspNet", "Sample")]
    namespace Samples.AspNet
    {
        
        [
            ToolboxData("<{0}:MailLink ID='MailLinkID' Text='WebMaster' runat=\"server\"> </{0}:MailLink>")
        ]
        public class MailLink : WebControl
        {
            // Custom code goes here.
        }
    
    }
    
  2. 디자인 타임 특성을 추가하여 디자인 타임에 비주얼 디자이너에서 컨트롤을 표시하는 데 사용될 사용자 지정 메타데이터를 제공합니다. 다음과 같은 두 가지 디자인 특성만 사용하면 MailLink 컨트롤을 Visual Studio 도구 상자에서 사용할 수 있습니다.

    TagPrefix 특성은 컨트롤 이름 MailLink 앞에 추가되는 접두사를 지정합니다. 접두사와 컨트롤 이름은 사용자 지정 컨트롤의 태그 이름을 함께 정의합니다. 이 경우에는 <Sample:MailLink> </Sample:MailLink>가 됩니다.

    <Assembly: TagPrefix("Samples.AspNet", "Sample")> 
    

    [assembly:TagPrefix("Samples.AspNet", "Sample")]
    

    ToolboxData 특성은 디자인 타임에 MailLink 컨트롤을 도구 상자에서 페이지로 끌어 놓을 때 생성되는 기본 태그를 지정합니다.

    <ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Webmaster' runat='server'"> </{0}:MailLink>")> 
    

    [ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Webmaster' runat=\"server\"> </{0}:MailLink>")]
    
  3. 라이브러리에서 MailLink 컨트롤을 컴파일하고 이름을 MaiLink.Dll로 지정합니다.

도구 상자에 사용자 지정 컨트롤을 추가하려면

  1. 보기 메뉴에서 도구 상자를 클릭합니다.

  2. 도구 상자에서 마우스 오른쪽 단추를 클릭하고 항목 선택을 선택합니다.

  3. 도구 상자 항목 선택 대화 상자에서 .NET Framework Components 탭을 선택한 다음 찾아보기 단추를 클릭하고 방금 빌드한 MailLink.Dll을 찾습니다.

  4. MailLink 컨트롤의 확인란을 선택하고 확인을 클릭합니다.

    사용자 지정 MailLink 컨트롤이 도구 상자에 나타납니다.

페이지에서 MailLink 컨트롤을 참조하려면

  1. 웹 프로젝트를 새로 만듭니다. 그런 다음 MailLink.aspx라는 페이지를 만듭니다. 이 페이지에는 프로젝트에서 선택한 언어에 따라 다음 지시문 중 하나가 들어 있습니다.

    <%@ page language="VB" %>
    

    <%@ page language="C#" %>
    
  2. MailLink 컨트롤을 호스팅할 다음과 같은 기본 페이지 구조를 추가합니다.

    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head runat="server">
        <title>Using the MailLink control</title>
    </head>
    <body>
    <h1>Using the MailLink Custom Server Control</h1>
        <form id="form1" runat="server">
        <div>
            
       </div>
    
        </form>
    </body>
    </html>
    
  3. 디자인 뷰로 전환하고 MailLink 컨트롤을 페이지에 끌어 놓습니다.

    Visual Studio에서 두 개의 항목(MailLink 컨트롤에 대한 Register 지시문 및 페이지에서 사용할 MailLink 컨트롤의 태그 이름)을 페이지에 추가합니다.

  4. 페이지를 브라우저에서 실행하고 Mail Webmaster 링크를 클릭합니다.

    메일 메시지가 열리고 주소가 컨트롤의 Email 속성에 지정된 주소로 설정됩니다.

MailLink 컨트롤은 WebControl 클래스에서 렌더링하는 기본 <span> 요소 대신 <a> 요소를 렌더링하도록 TagKey 속성을 재정의합니다.

using System;
using System.ComponentModel;
using System.Security;
using System.Security.Permissions;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

[assembly:TagPrefix("Samples.AspNet", "Sample")]
namespace Samples.AspNet
{


    [
        AspNetHostingPermission(SecurityAction.Demand,
        Level = AspNetHostingPermissionLevel.Minimal),
        AspNetHostingPermission(SecurityAction.InheritanceDemand,
        Level = AspNetHostingPermissionLevel.Minimal),
        ParseChildren(true, "Text"),
        DefaultProperty("Email"),
        ToolboxData("<{0}:MailLink ID='MailLinkID' Text='Mail Web Master' runat=\"server\"> </{0}:MailLink>")
    ]
    public class MailLink : WebControl
    {
        [
            Browsable(true),
            Category("Appearance"),
            DefaultValue("webmaster@contoso.com"),
            Description("The e-mail address.")
        ]
        public virtual string Email
        {
            get
            {
                string s = (string)ViewState["Email"];
                return (s == null) ? "webmaster@contoso.com" : s;
            }
            set
            {
                ViewState["Email"] = value;
            }
        }

        [
            Browsable(true),
            Category("Appearance"),
            DefaultValue("Web Master"),
            Description("The name to display."),
            Localizable(true),
            PersistenceMode(PersistenceMode.InnerDefaultProperty)
        ]
        public virtual string Text
        {
            get
            {
                string s = (string)ViewState["Text"];
                return (s == null) ? String.Empty : s;
            }
            set
            {
                ViewState["Text"] = value;
            }
        }

        protected override HtmlTextWriterTag TagKey
        {
            get
            {
                return HtmlTextWriterTag.A;
            }
        }

        protected override void AddAttributesToRender(
            HtmlTextWriter writer)
        {
            base.AddAttributesToRender(writer);
            writer.AddAttribute(HtmlTextWriterAttribute.Href,
                "mailto:" + Email);
        }

        protected override void RenderContents(HtmlTextWriter writer)
        {
            if (Text == String.Empty)
            {
                Text = Email;
            }
            writer.WriteEncodedText(Text);
        }
    }
}


MailLink 컨트롤에서는 내부 텍스트 지속성도 보여 줍니다. 페이지 개발자는 다음 예제와 같이 MailLink를 사용하여 컨트롤 태그 내에 Text 속성을 지정할 수 있습니다.

<Sample:MailLink id="MaillinkID" Email="Webmaster@contoso.com" 
    runat="server">
 Mail Support Team
</Sample:MailLink>

다음 예제와 같이 내부 지속성은 컨트롤의 여는 태그에서 기본 지속성과 대조를 이룹니다.

<Sample:MailLink Text="Mail Webmaster" runat="server" > </Sample:MailLink>

위 코드는 도구 상자에서 컨트롤을 페이지로 끌어 놓을 때 생성되는 기본 태그입니다.

Visual Studio에서 라이브러리 프로젝트를 만들고 위 절차와 같이 WebControl에서 파생되는 사용자 지정 클래스를 정의합니다. 전체 소스 코드는 이전 코드 부분에 나와 있습니다.

사용자 지정 서버 컨트롤에서는 ASP.NET 기능을 확장하며, 몇 가지 명확한 보안 지침에 따라야 합니다. 특히 다음과 같은 사항을 고려해야 합니다.

  • 런타임 및 디자인 타임 보안

  • 강력한 이름 어셈블리의 사용자 지정 컨트롤

  • 사용자 지정 서버 컨트롤을 호스팅하는 서버의 운영 체제 보안 및 ACL(액세스 제어 목록)

  • 컨트롤에서 액세스할 수 있는 리소스를 제한하는 코드 액세스 보안

  • 전역 어셈블리 캐시의 관리되는 어셈블리

표시: