Share via


연습: ASP.NET 1.1용 사용자 지정 데이터 바인딩 ASP.NET 웹 컨트롤 만들기

업데이트: 2007년 11월

이 연습에서는 바인딩 가능한 데이터 소스를 노출하는 간단한 데이터 바인딩 서버 컨트롤을 만드는 방법을 보여 줍니다.

ASP.NET 데이터 바인딩 서버 컨트롤은 레코드 또는 항목의 컬렉션을 나타내는 데이터 소스의 UI(사용자 인터페이스)를 제공합니다. 데이터 바인딩 서버 컨트롤의 예로는 DataListRepeater 서버 컨트롤이 있습니다. ASP.NET에서 제공되는 데이터 바인딩된 컨트롤에 대한 자세한 내용은 ASP.NET 데이터 바인딩 웹 서버 컨트롤 개요를 참조하십시오.

참고:

이 연습에서 보여 주는 컨트롤은 ASP.NET 버전 1.1과 호환됩니다. ASP.NET 2.0용 사용자 지정 데이터 바인딩 웹 컨트롤을 만드는 방법에 대한 자세한 내용은 ASP.NET 2.0용 사용자 지정 데이터 바인딩 웹 서버 컨트롤 개발을 참조하십시오.

ASP.NET 1.1 데이터 바인딩 서버 컨트롤은 다음과 같은 형식에 바인딩될 수 있습니다.

이 연습에서는 IEnumerable 인터페이스를 구현하는 모든 개체에 바인딩될 수 있는 데이터 바인딩된 컨트롤을 만듭니다.

이 연습에서 수행할 작업은 다음과 같습니다.

  • 사용자 지정 데이터 바인딩된 컨트롤을 테스트할 웹 사이트를 만듭니다.

  • 데이터 바인딩된 컨트롤 클래스를 만듭니다. 이 클래스에서는 페이지 개발자가 바인딩할 데이터의 위치를 지정할 수 있도록 IListSource 또는 IEnumerable 형식의 속성을 노출해야 합니다. 또한 기본 클래스의 DataBindCreateChildControls 메서드를 재정의해야 합니다.

  • Web.config 파일에 컨트롤을 등록합니다.

  • ASP.NET 웹 페이지에서 컨트롤을 테스트합니다.

  • 컨트롤을 이진 코드로 배포할 수 있도록 컨트롤을 컴파일합니다.

  • 컴파일된 사용자 지정 데이터 바인딩 서버 컨트롤을 테스트합니다.

컨트롤을 테스트할 웹 사이트 만들기

ASP.NET의 동적 컴파일을 사용하면 컨트롤을 어셈블리로 컴파일하지 않고도 페이지에서 컨트롤을 테스트할 수 있습니다. ASP.NET에서는 웹 사이트 루트의 App_Code 디렉터리에 있는 코드를 동적으로 컴파일합니다. 따라서 컨트롤을 수동으로 어셈블리로 컴파일하지 않고도 페이지에서 App_Code 디렉터리에 있는 소스 파일의 클래스에 액세스할 수 있습니다.

참고:

App_Code 디렉터리는 ASP.NET 1.0 및 1.1 버전에 없었던 새로운 기능입니다. 컨트롤을 처음 테스트할 때 App_Code 디렉터리를 사용할지 여부를 선택할 수 있습니다. 서버 컨트롤을 빌드하는 주요 단계는 이전 버전과 동일하며, "컨트롤을 어셈블리로 컴파일" 단원에 설명되어 있습니다.

사용자 지정 데이터 바인딩된 컨트롤을 테스트할 웹 사이트를 만들려면

  1. ServerControlsTest라는 웹 사이트를 만듭니다.

    IIS에서 이 사이트를 ServerControlsTest라는 가상 디렉터리로 만들 수 있습니다. IIS 가상 디렉터리를 만들고 구성하는 데 대한 자세한 내용은 방법: IIS 5.0 및 6.0에서 가상 디렉터리 만들기 및 구성을 참조하십시오.

  2. 웹 사이트의 루트 디렉터리 바로 아래에 App_Code 디렉터리를 만듭니다.

SimpleDataBoundControl 클래스 만들기

다음 단계에서는 컨트롤 클래스를 만듭니다.

SimpleDataBoundControl 클래스를 만들려면

  1. 이전 절차에서 만든 App_Code 폴더에 사용할 프로그래밍 언어에 따라 SimpleDataBoundControl.cs 또는 SimpleDataBoundControl.vb라는 클래스를 만듭니다.

  2. 다음 코드를 클래스 파일에 추가합니다.

    Imports System
    Imports System.Collections
    Imports System.ComponentModel
    Imports System.Web
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    
    Namespace Samples.ASPNet.VB.Controls
        <DefaultProperty("DataSource")> _
            Public Class SimpleDataBoundControl
            Inherits WebControl
    
            Private _dataSource As IEnumerable
            Private _label As Label
            Private _button As Button
            Private _table As Table
    
            <Category("Data"), DefaultValue(""), Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")> _
            Public Overridable Property DataSource() As IEnumerable
                Get
                    Return _dataSource
                End Get
                Set(ByVal value As IEnumerable)
                    If TypeOf value Is IEnumerable OrElse value Is Nothing Then
                        _dataSource = value
                    Else
                        Throw New ArgumentException()
                    End If
                End Set
            End Property
    
            Protected Overridable Function GetDataSource() As IEnumerable
                If _dataSource Is Nothing Then
                    Return Nothing
                End If
    
                Dim resolvedDataSource As IEnumerable
                resolvedDataSource = _dataSource
    
                Return resolvedDataSource
    
            End Function 'GetDataSource
    
            Protected Overridable Sub CreateMyControlHeirarchy(ByVal useViewState As Boolean)
                Dim resolvedDataSource As IEnumerable = Nothing
                If useViewState Then
                    If Not (ViewState("RowCount") Is Nothing) Then
                        resolvedDataSource = New Object(Fix(ViewState("RowCount"))) {}
                    Else
                        Throw New Exception("Unable to retrieve expected data from ViewState")
                    End If
                Else
                    resolvedDataSource = GetDataSource()
                End If
    
                If Not (resolvedDataSource Is Nothing) Then
                    ' Create a label that will indicate form which source the data has been provided.
                    Dim s As String
                    If useViewState Then
                        s = "Data collection retrieved from ViewState:"
                    Else
                        s = "Data collection retrieved from bound data source:"
                    End If
                    _label = New Label()
                    Me.Controls.Add(Me._label)
                    _label.Text = s
    
                    _button = New Button()
                    Me.Controls.Add(Me._button)
                    _button.Text = "Test re-binding of ViewState"
    
                    _table = New Table()
                    Me.Controls.Add(Me._table)
    
                    Dim dataItem As Object
                    For Each dataItem In resolvedDataSource
                        Dim row As New TableRow()
                        _table.Rows.Add(row)
                        Dim cell As New TableCell()
                        If Not useViewState Then
                            cell.Text = dataItem.ToString()
                        End If
                        row.Cells.Add(cell)
                    Next dataItem
    
                    ViewState("RowCount") = _table.Rows.Count
                End If
    
            End Sub 'CreateMyControlHeirarchy
    
            Protected Overrides Sub CreateChildControls()
                Controls.Clear()
    
                If Not (ViewState("RowCount") Is Nothing) Then
                    Dim useViewState As Boolean = True
                    CreateMyControlHeirarchy(useViewState)
                End If
    
            End Sub 'CreateChildControls
    
            Public Overrides Sub DataBind()
                MyBase.OnDataBinding(EventArgs.Empty)
    
                Controls.Clear()
                ClearChildViewState()
                TrackViewState()
    
                Dim useViewState As Boolean = False
                CreateMyControlHeirarchy(useViewState)
    
                ChildControlsCreated = True
            End Sub 'DataBind
    
            Protected Overrides Sub RenderContents(ByVal writer As HtmlTextWriter)
                Me._label.RenderControl(writer)
                Me._table.RenderControl(writer)
                Me._button.RenderControl(writer)
            End Sub 'RenderContents
        End Class 'SimpleDataBoundControl
    End Namespace
    
    using System;
    using System.Collections;
    using System.ComponentModel;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    namespace Samples.AspNet.CS.Controls
    {
        [
            DefaultProperty("DataSource")
        ]
        public class SimpleDataBoundControl : WebControl
        {
            private IEnumerable _dataSource;
            private Label _label;
            private Button _button;
            private Table _table;
    
            [
            Category("Data"),
            DefaultValue(""),
            Description("An exposed data source: A public member of type IEnumerable to bind to such as an Array, ArrayList or Hashtable.")
            ]
            public virtual IEnumerable DataSource
            {
                get
                {
                    return _dataSource;
                }
                set
                {
                    if ((value is IEnumerable) || (value == null))
                    {
                        _dataSource = value;
                    }
                    else
                    {
                        throw new ArgumentException();
                    }
                }
            }
    
            protected virtual IEnumerable GetDataSource()
            {
                if (_dataSource == null)
                {
                    return null;
                }
    
                IEnumerable resolvedDataSource;
                resolvedDataSource = _dataSource as IEnumerable;
    
                return resolvedDataSource;
            }
    
            protected virtual void CreateMyControlHeirarchy(bool useViewState)
            {
                IEnumerable resolvedDataSource = null;
                if (useViewState)
                {
                    if (ViewState["RowCount"] != null)
                    {
                        resolvedDataSource = new object[(int)ViewState["RowCount"]];
                    }
                    else
                    {
                        throw new Exception("Unable to retrieve expected data from ViewState");
                    }
                }
                else
                {
                    resolvedDataSource = GetDataSource();
                }
    
                if (resolvedDataSource != null)
                {
                    // Create a label that will indicate form which source the data has been provided.
                    String s;
                    if (useViewState)
                    {
                        s = "Data collection retrieved from ViewState:";
                    }
                    else
                    {
                        s = "Data collection retrieved from bound data source:";
                    }
                    _label = new Label();
                    this.Controls.Add(this._label);
                    _label.Text = s;
    
                    _button = new Button();
                    this.Controls.Add(this._button);
                    _button.Text = "Test re-binding of ViewState";
    
                    _table = new Table();
                    this.Controls.Add(this._table);
    
                    foreach (object dataItem in resolvedDataSource)
                    {
                        TableRow row = new TableRow();
                        _table.Rows.Add(row);
                        TableCell cell = new TableCell();
                        if (!useViewState)
                        {
                            cell.Text = dataItem.ToString();
                        }
                        row.Cells.Add(cell);
                    }
    
                    ViewState["RowCount"] = _table.Rows.Count;
                }
            }
    
            protected override void CreateChildControls()
            {
                Controls.Clear();
    
                if (ViewState["RowCount"] != null)
                {
                    bool useViewState = true;
                    CreateMyControlHeirarchy(useViewState);
                }
            }
    
            public override void DataBind()
            {
                base.OnDataBinding(EventArgs.Empty);
    
                Controls.Clear();
    
                ClearChildViewState();
    
                TrackViewState();
    
                bool useViewState = false;
                CreateMyControlHeirarchy(useViewState);
    
                ChildControlsCreated = true;
            }
    
            protected override void RenderContents(HtmlTextWriter writer)
            {
                this._label.RenderControl(writer);
                this._table.RenderControl(writer);
                this._button.RenderControl(writer);
            }
        }
    }
    

코드 설명

SimpleDataBoundControl 클래스에서는 해당 DataSource 속성에 지정된 데이터 수집에 따라 HTML 테이블을 렌더링합니다. ASP.NET 1.1 데이터 바인딩 웹 서버 컨트롤에서는 IEnumerable 또는 IListSource 형식으로 설정할 수 있는 바인딩 가능한 DataSource 속성을 노출해야 합니다.

예제 코드에서 DataSource 속성의 set 접근자에서는 값이 null 또는 IEnumerable 형식 개체로 설정되는지 확인합니다. 따라서 이 예제에서는 페이지 개발자가 Array, ArrayList 또는 Hashtable 개체 등의 모든 IEnumerable 형식에 바인딩할 수 있습니다. 개발자는 초기에 DataSource를 기본값인 null 값으로 설정해 두고 코드에서 속성을 설정할 수 있습니다.

메타데이터 특성인 Category, DefaultValue 및 Description에서는 디자인 도구, ASP.NET 페이지 파서 및 공용 언어 런타임에 사용되는 정보를 제공합니다.

CreateMyControlHeirarchy 도우미 메서드를 통해 컨트롤의 자식 컨트롤 계층 구조를 만드는 코드를 하나의 공통 코드 경로에 유지할 수 있습니다. 이 메서드는 재정의된 DataBind 메서드 및 재정의된 CreateChildControls 메서드 모두에서 호출됩니다. 재정의된 DataBind 메서드는 필수 항목입니다. 이 메서드는 관련 데이터 소스의 개체를 열거하고 자식 컨트롤을 만듭니다. 재정의된 CreateChildControls 메서드는 필수 항목이며, 뷰 상태에 저장된 데이터를 기반으로 자식 컨트롤 계층 구조를 다시 만듭니다.

상속된 RenderContents 메서드를 재정의하여 컨트롤을 렌더링합니다. 이를 통해 컨트롤을 자체 태그 내에서 렌더링할 수 있습니다. RenderContents 메서드에 전달된 매개 변수는 HtmlTextWriter 형식의 개체이며 이 개체는 태그와 기타 HTML 및 HTML 변형 태그를 렌더링하는 메서드가 포함된 유틸리티 클래스입니다.

데이터 바인딩 웹 서버 컨트롤에서 필수적으로 구현해야 하는 항목에 대한 자세한 내용은 ASP.NET 1.1용 사용자 지정 데이터 바인딩 웹 서버 컨트롤 개발을 참조하십시오.

태그 접두사 만들기

태그 접두사는 컨트롤을 페이지에서 선언적으로 만드는 경우 컨트롤의 형식 이름 앞에 나오는 접두사입니다(예: <asp:Table />의 "asp"). ASP.NET의 경우 컨트롤을 페이지에서 선언적으로 사용하려면 컨트롤의 네임스페이스에 매핑되는 태그 접두사가 필요합니다. 페이지 개발자는 다음 예제와 같이 사용자 지정 컨트롤을 사용하는 각 페이지에 @ Register 지시문을 추가하여 태그 접두사/네임스페이스 매핑을 제공할 수 있습니다.

<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.CS.Controls"%>
<%@ Register TagPrefix="aspSample" 
    Namespace="Samples.AspNet.VB.Controls"%>
참고:

ASP.NET 2.0의 @ Register 지시문은 ASP.NET 1.0 및 ASP.NET 1.1의 지시문과 같습니다. 이전 버전의 ASP.NET에서 사용되는 @ Register 지시문에 익숙한 경우 위에 나와 있는 @ Register 지시문에는 컨트롤 어셈블리의 이름을 지정하는 assembly 특성이 없음을 알 수 있습니다. assembly 특성이 없는 경우 ASP.NET에서는 어셈블리가 App_Code 디렉터리의 소스 파일에서 동적으로 컴파일된다고 가정합니다.

페이지 개발자는 각 .aspx 페이지에서 @ Register 지시문을 사용하는 대신 Web.config 파일에 태그 접두사 및 네임스페이스 매핑을 지정할 수 있습니다. 이 방법은 사용자 지정 컨트롤이 웹 응용 프로그램의 여러 페이지에 사용될 경우 유용합니다.

참고:

태그 접두사의 구성 엔트리는 ASP.NET 2.0에 새로 추가된 기능입니다. ASP.NET 1.0 및 1.1에서는 사용자 지정 컨트롤을 사용한 각 페이지의 @ Register 지시문에 태그 접두사 매핑이 지정되었습니다.

다음 절차에서는 Web.config 파일에 태그 접두사 매핑을 지정하는 방법을 설명합니다.

Web.config 파일에서 태그 접두사 매핑을 추가하려면

  1. 웹 사이트에 Web.config라는 파일이 없는 경우 웹 사이트의 루트 폴더에 이 파일을 만듭니다.

  2. 비어 있는 새 Web.config 파일을 만든 경우 다음 XML 태그를 파일에 복사하고 파일을 저장합니다. 사이트에 이미 Web.config 파일이 있는 경우 이 파일에 강조 표시된 다음 요소를 추가합니다.

    참고:

    태그 접두사 엔트리는 <controls> 요소의 자식이어야 하고, 이 요소는 <system.web> 아래의 <pages> 섹션 아래에 있어야 합니다.

    <?xml version="1.0"?>
    <configuration>
      <system.web>    
       <pages>
         <controls>
           <add tagPrefix="aspSample"            namespace="Samples.AspNet.CS.Controls">       </add>
         </controls>
       </pages>
      </system.web>
    </configuration>
    
    <?xml version="1.0"?>
    <configuration>
      <system.web>    
       <pages>
         <controls>
           <add tagPrefix="aspSample"            namespace="Samples.AspNet.VB.Controls">       </add>
         </controls>
       </pages>
      </system.web>
    </configuration>
    

    강조 표시된 섹션은 태그 접두사 "aspSample"을 Samples.AspNet.CS.Controls 또는 Samples.AspNet.VB.Controls 네임스페이스에 매핑하는 태그 접두사 엔트리를 보여 줍니다.

구성 파일에 태그 접두사 매핑을 지정한 후에는 웹 사이트의 페이지에서 SimpleDataBoundControl 컨트롤을 선언적으로 <aspSample:SimpleDataBoundControl />로 사용할 수 있습니다.

사용자 지정 데이터 바인딩된 컨트롤을 사용하는 페이지 만들기

이 연습 단원에서는 사용자 지정 데이터 바인딩된 컨트롤을 테스트할 수 있게 하는 페이지 태그를 만듭니다.

사용자 지정 데이터 바인딩된 컨트롤을 사용하는 페이지를 만들려면

  1. 웹 사이트에 TestSimpleDataBoundControl.aspx라는 파일을 만듭니다.

  2. 다음 태그를 TestSimpleDataBoundControl.aspx 파일에 복사하고 파일을 저장합니다.

    <%@ Page Language="VB" %>
    <%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.VB.Controls" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script >
        Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
            If Not IsPostBack Then
                Dim a As New ArrayList()
                a.Add("One")
                a.Add("Two")
                a.Add("Three")
                a.Add("Four")
    
                simpleDataBoundControl1.DataSource = a
                simpleDataBoundControl1.DataBind()
            End If
        End Sub 'Page_Load
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head id="Head1" >
        <title>SimpleDataBoundControl test page</title>
    </head>
    <body>
        <form id="form1" >
        <div>
            <aspSample:SimpleDataBoundControl  id="simpleDataBoundControl1" BorderStyle="Solid" ></aspSample:SimpleDataBoundControl>
        </div>
        </form>
    </body>
    </html>
    
    <%@ Page Language="C#" Trace="true" EnableViewState="true" %>
    <%@ Register TagPrefix="aspSample" Namespace="Samples.AspNet.CS.Controls" %>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <script >
        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                ArrayList a = new ArrayList();
                a.Add("One");
                a.Add("Two");
                a.Add("Three");
                a.Add("Four");
    
                simpleDataBoundControl1.DataSource = a;
                simpleDataBoundControl1.DataBind();
            }
        }
    </script>
    <html xmlns="http://www.w3.org/1999/xhtml" >
    <head >
        <title>SimpleDataBoundControl test page</title>
    </head>
    <body>
        <form id="form1" >
        <div>
            <aspSample:SimpleDataBoundControl  id="simpleDataBoundControl1" BorderStyle="Solid" ></aspSample:SimpleDataBoundControl>
        </div>
        </form>
    </body>
    </html>
    
  3. TestSimpleDataBoundControl.aspx 페이지를 실행합니다.

  4. 사용자 지정 컨트롤의 소스 코드를 변경합니다. 예를 들어 RenderContents 메서드의 끝에 다음 코드 줄을 입력하여 추가 문자열을 출력합니다.

    writer.Write("<br />Testing how the App_Code directory works.");
    
    writer.Write("<br />Testing how the App_Code directory works.")
    
  5. 브라우저에서 TestSimpleDataBoundControl.aspx 페이지를 새로 고칩니다.

    컨트롤을 컴파일하지 않았지만 컨트롤의 변경 내용이 페이지에 적용됨을 확인할 수 있습니다.

컨트롤을 어셈블리로 컴파일

App_Code 디렉터리를 사용하면 컨트롤을 컴파일하지 않고도 테스트할 수 있지만 컨트롤을 개체 코드로 다른 개발자에게 배포하려면 컴파일해야 합니다. 또한 어셈블리로 컴파일되지 않은 컨트롤은 비주얼 디자이너의 도구 상자에 추가할 수 없습니다.

컨트롤을 어셈블리로 컴파일하려면

  1. 다음 단계를 수행하여 사용자 컴퓨터의 Windows 환경 변수 PATH에 .NET Framework 설치 경로가 포함되도록 설정합니다.

    1. Windows에서 내 컴퓨터를 마우스 오른쪽 단추로 클릭하고 속성을 선택한 다음 고급 탭, 환경 변수 단추를 차례로 클릭합니다.

    2. 시스템 변수 목록에서 Path 변수를 두 번 클릭합니다.

    3. 변수 값 텍스트 상자에서 기존 값의 끝에 세미콜론(;)을 추가한 후 .NET Framework 설치 경로를 입력합니다. 일반적으로 .NET Framework는 Windows 설치 디렉터리에서 \Microsoft.NET\Framework\versionNumber에 설치됩니다.

    4. 확인을 클릭하여 각 대화 상자를 닫습니다.

  2. 이 연습에서 앞서 만든 소스 파일이 들어 있는 App_Code 디렉터리에서 다음 명령을 실행합니다.

    이렇게 하면 App_Code 디렉터리에 Samples.AspNet.CS.Controls.dll 또는 Samples.AspNet.VB.Controls.dll이라는 어셈블리가 생성됩니다.

    csc /t:library /out:Samples.AspNet.CS.Controls.dll /r:System.dll /r:System.Web.dll *.cs
    
    vbc /t:library /out:Samples.AspNet.VB.Controls.dll /r:System.dll /r:System.Web.dll *.vb
    

    /t:library 컴파일러 옵션을 사용하면 컴파일러에서 실행 어셈블리 대신 라이브러리를 만듭니다. /out 옵션은 어셈블리에 사용할 이름을 제공하고 /r 옵션은 어셈블리에 링크된 어셈블리를 나열합니다.

    참고:

    예제를 독립적으로 유지하기 위해 이 연습에서는 컨트롤이 하나만 있는 어셈블리를 만듭니다. 일반적으로 .NET Framework 디자인 지침에 따르면 적은 수의 클래스만 포함된 어셈블리를 만들지 않는 것이 좋습니다. 또한 쉽게 배포할 수 있도록 가능한 적은 수의 어셈블리를 만들어야 합니다.

TagPrefixAttribute를 사용하여 태그 접두사/네임스페이스 매핑 제공

이전 단계에서는 페이지 개발자가 페이지나 Web.config 파일에 태그 접두사를 지정하는 방법을 확인했습니다. 컨트롤을 컴파일하면 비주얼 디자이너에서 컨트롤에 사용할 기본 태그 접두사를 알려 주는 어셈블리 수준 System.Web.UI.TagPrefixAttribute 특성도 포함할 수 있습니다. TagPrefixAttribute 특성은 비주얼 디자이너가 페이지의 @ Register 지시문 또는 Web.config 파일에서 태그 접두사 매핑을 찾지 못한 경우 사용할 태그 접두사를 제공하므로 유용합니다. 도구 상자의 컨트롤을 처음으로 두 번 클릭하거나 페이지로 끌어 오면 태그 접두사가 페이지에 등록됩니다.

TagPrefixAttribute 특성을 사용하려는 경우 컨트롤과 함께 컴파일되는 별도의 파일에 이 특성을 지정할 수 있습니다. 규칙에 따라 이 파일의 이름은 AssemblyInfo.cs 또는 AssembyInfo.vb와 같이 AssemblyInfo.languageExtension으로 지정됩니다. 다음 절차에서는 TagPrefixAttribute 메타데이터를 지정하는 방법을 설명합니다.

참고:

컨트롤의 어셈블리에 TagPrefixAttribute를 지정하지 않고 페이지 개발자가 페이지 또는 Web.config 파일에 태그 접두사/네임스페이스 매핑을 지정하지 않는 경우 비주얼 디자이너에서 기본 태그 접두사를 만들 수 있습니다. 예를 들어 도구 상자에서 컨트롤을 끌어 오면 Visual Studio 2005에서는 컨트롤에 대해 cc1 같은 자체의 고유한 태그를 만듭니다.

TagPrefixAttribute를 사용하여 태그 접두사 매핑을 추가하려면

  1. 소스 코드 디렉터리에 AssemblyInfo.cs 또는 AssemblyInfo.vb라는 파일을 만들고 다음 코드를 파일에 추가합니다.

    using System;
    using System.Web.UI;
    [assembly: TagPrefix("Samples.AspNet.CS.Controls", "aspSample")]
    
    Imports System
    Imports System.Web.UI
    <Assembly: TagPrefix("Samples.AspNet.VB.Controls", "aspSample")> 
    

    태그 접두사 특성은 Samples.AspNet.CS.Controls 또는 Samples.AspNet.VB.Controls 네임스페이스와 aspSample 접두사 간에 매핑을 만듭니다.

  2. 포함 리소스가 있는지 여부에 관계없이 이전에 사용된 컴파일 명령을 사용하여 모든 소스 파일을 다시 컴파일합니다.

ASP.NET 페이지에서 컴파일된 사용자 지정 데이터 바인딩 서버 컨트롤 사용

컴파일된 버전의 사용자 지정 컨트롤을 테스트하려면 웹 사이트의 페이지에서 컨트롤의 어셈블리를 사용할 수 있도록 설정해야 합니다.

웹 사이트에서 컨트롤의 어셈블리를 사용할 수 있도록 설정하려면

  1. 사이트에 Bin 디렉터리가 없는 경우 웹 사이트 루트 아래에 Bin 디렉터리를 만듭니다.

  2. 컨트롤 어셈블리(Samples.AspNet.CS.Controls.dll 또는 Samples.AspNet.VB.Controls.dll)를 App_Code 디렉터리에서 Bin 디렉터리로 끌어 놓아 옮깁니다.

  3. 컨트롤의 소스 파일을 App_Code 디렉터리에서 웹 사이트의 다른 디렉터리로 옮깁니다.

    소스 파일을 App_Code 디렉터리 밖으로 옮기지 않으면 컴파일된 어셈블리와 ASP.NET에서 동적으로 생성된 어셈블리 모두에 컨트롤 형식이 유지됩니다. 이렇게 되면 컨트롤을 로드할 때 모호한 참조가 만들어지고 컨트롤이 사용되는 페이지에서 컴파일러 오류가 발생합니다.

이 연습에서 만든 어셈블리는 웹 사이트의 페이지에서 컨트롤을 사용할 수 있도록 ASP.NET 웹 사이트의 Bin 디렉터리에 배치해야 하므로 전용 어셈블리입니다. 복사본이 설치되어 있지 않은 다른 응용 프로그램에서는 이 어셈블리에 액세스할 수 없습니다. 공유 웹 호스팅 응용 프로그램에 대해 컨트롤을 만드는 경우 일반적으로 컨트롤을 전용 어셈블리에 패키지합니다. 그러나 전용 호스팅 환경에서 사용할 컨트롤을 만들거나 ISP가 모든 고객이 사용할 수 있도록 설정하는 컨트롤 모음을 만들 경우에는 전역 어셈블리 캐시에 설치된 강력한 이름의 공유 어셈블리에 컨트롤을 패키지해야 합니다. 자세한 내용은 어셈블리 및 전역 어셈블리 캐시 사용을 참조하십시오.

이제 Web.config 파일에 만든 태그 접두사 매핑을 수정하여 컨트롤의 어셈블리 이름을 지정해야 합니다.

Web.config 파일의 태그 접두사 매핑을 수정하려면

  • Web.config 파일을 편집하여 <add tagPrefix=name> 요소에 assembly 특성을 추가합니다.

    <controls>
      <add tagPrefix="aspSample"
        namespace="Samples.AspNet.CS.Controls" 
        assembly="Samples.AspNet.CS.Controls">
      </add>
    </controls>
    
    <controls>
      <add tagPrefix="aspSample"   
        namespace="Samples.AspNet.VB.Controls" 
        assembly="Samples.AspNet.VB.Controls">
      </add>
    </controls>
    

assembly 특성은 컨트롤을 포함하는 어셈블리의 이름을 지정하고, <add tagPrefix=name> 요소는 태그 접두사를 네임스페이스/어셈블리 조합에 매핑합니다. ASP.NET에 의해 App_Code 디렉터리의 소스 파일에서 동적으로 어셈블리가 생성되면 어셈블리 특성이 필요하지 않습니다. 어셈블리 특성이 사용되지 않는 경우 ASP.NET은 App_Code 디렉터리에서 동적으로 생성된 어셈블리로부터 컨트롤 형식을 로드합니다.

이제 페이지에 컨트롤을 표시하여 컨트롤을 테스트할 수 있습니다.

사용자 지정 컨트롤을 사용하는 페이지를 보려면

  • 주소 표시줄에 다음 URL을 입력하여 브라우저에 TestSimpleDataBoundControl.aspx 페이지를 표시합니다.

    https://localhost/ServerControlsTest/TestSimpleDataBoundControl.aspx
    

Visual Studio 2005 같은 비주얼 디자이너에서 컨트롤을 사용하는 경우 도구 상자에 컨트롤 추가, 도구 상자의 컨트롤을 디자인 화면으로 끌어 오기, 속성 브라우저에서 속성 및 이벤트 액세스 등의 작업을 수행할 수 있습니다. 또한 Visual Studio 2005의 경우 컨트롤은 페이지 디자이너의 소스 뷰 및 코드 편집기에서 IntelliSense 기능을 완벽하게 지원합니다.

다음 단계

이 연습의 간단한 사용자 지정 데이터 바인딩 서버 컨트롤에서는 페이지 개발자가 컨트롤을 외부 데이터 소스에 바인딩하는 표준 방식을 제공하는 사용자 지정 컨트롤을 만드는 데 사용되는 기본 단계를 보여 줍니다. 이 연습을 시작으로 Visual Studio에서 복잡한 사용자 지정 서버 컨트롤을 만드는 방법을 알아 볼 수 있습니다. 다음과 같은 항목을 살펴 보십시오.

참고 항목

작업

연습: 사용자 지정 서버 컨트롤 개발 및 사용

개념

ASP.NET 데이터 바인딩 웹 서버 컨트롤 개요

사용자 지정 서버 컨트롤의 메타데이터 특성

ASP.NET 컨트롤 디자이너 개요

참조

HierarchicalDataBoundControlDesigner

기타 리소스

사용자 지정 ASP.NET 서버 컨트롤 개발