다음을 통해 공유


방법: 데이터 모델의 내장 형식이 아닌 데이터 형식에 대한 데이터 필드 모양 및 동작 사용자 지정

업데이트: 2008년 7월

ASP.NET Dynamic Data를 사용하여 작업할 경우 System.ComponentModel.DataAnnotations.DataTypeAttribute 특성을 사용하여 데이터 모델 필드에 데이터 형식을 할당할 수 있습니다. 이 방법은 Dynamic Data가 유추하는 CLR 형식보다 특정 데이터 필드에 더 적합한 데이터 형식을 할당하려는 경우에 유용합니다.

예를 들어 전자 메일 주소를 포함하는 텍스트 필드를 전자 메일 형식으로 표시하여 전자 메일 형식을 특정 텍스트 형식으로 정의할 수 있습니다. 해당 필드를 처리하는 텍스트 필드 템플릿은 이 특성이 제공하는 정보를 사용하여 전자 메일 형식을 표시 및 편집하기 위한 특수한 UI를 만들 수 있습니다. EmailAddress() 특성으로 표시된 텍스트 필드는 System.Web.UI.WebControls.HyperLink 컨트롤로 표시될 수 있습니다.

사용자 지정 필드 템플릿을 UIHint 특성과 함께 사용하여 특정 데이터 형식을 특수하게 처리하도록 지정할 수 있습니다. DataTypeAttribute 특성을 사용하면 여러 형식에 하나의 필드 템플릿을 사용할 수 있습니다.

DataTypeAttribute 특성을 사용할지 UIHint 특성을 사용할지 여부는 원하는 스타일과 편의성에 따라 결정합니다. UIHint 속성을 사용하는 방법에 대한 자세한 내용은 방법: ASP.NET Dynamic Data 기본 필드 템플릿 사용자 지정을 참조하십시오.

이 항목에서는 DataTypeAttribute 특성을 사용하는 방법에 대해 설명합니다.

데이터 형식 특성을 데이터 필드에 연결하려면

  1. 데이터 필드를 사용자 지정할 ASP.NET 웹 사이트를 엽니다.

    참고:

    Dynamic Data를 사용하도록 웹 사이트가 구성되어 있어야 합니다.

  2. 솔루션 탐색기에서 App_Code 폴더를 마우스 오른쪽 단추로 클릭한 다음 새 항목 추가를 클릭합니다.

  3. Visual Studio에 설치되어 있는 템플릿에서 클래스를 클릭합니다.

  4. 이름 상자에 파일의 이름을 입력합니다.

    여기서 만드는 클래스의 이름은 테이블을 나타내는 엔터티 클래스 이름과 일치해야 합니다. 예를 들어 Customer 테이블을 사용하여 작업하는 경우 클래스 이름을 Customer로 지정합니다.

  5. 클래스 정의를 partial 클래스로 만들려면 해당 클래스 정의에 Visual Basic의 Partial 키워드 또는 Visual C#의 partial 키워드를 추가합니다.

  6. 다음 예제에서처럼 Visual Basic의 Imports 키워드 또는 Visual C#의 using 키워드를 사용하여 System.ComponentModelSystem.ComponentModel.DataAnnotations 네임스페이스에 대한 참조를 추가합니다.

    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    
    Imports System.ComponentModel
    Imports System.ComponentModel.DataAnnotations 
    
  7. 특성을 제공할 각 데이터 필드에 대한 속성 접근자를 추가합니다.

    다음 예제에서는 Customer 테이블의 필드에 해당하는 세 개의 속성에 대한 속성 접근자를 만드는 방법을 보여 줍니다.

    public class CustomerMetaData {
    
        public object PasswordHash { get; set; }
        public object PasswordSalt { get; set; }
        public object ModifiedDate { get; set; }    
    }
    
    Public Class CustomerMetaData
    
        Public PasswordHash As Object
        Public PasswordSalt As Object
        Public ModifiedDate As Object
    End Class
    
  8. partial 클래스의 연결된 메타데이터 클래스로 사용할 또 다른 클래스를 만듭니다. 이 클래스에는 이전에 사용하지 않은 모든 클래스 이름을 지정할 수 있습니다. 예를 들어 CustomerMetaData라는 클래스를 Customer 클래스의 연결된 메타데이터 클래스로 만들 수 있습니다.

  9. MetadataTypeAttribute 특성을 partial 클래스 정의에 추가합니다. 특성의 매개 변수에 대해서는 이전 단계에서 만든 연결된 메타데이터 클래스의 이름을 사용합니다.

    [MetadataType(typeof(CustomerMetaData))]
    public partial class Customer {
    
    }
    
    <MetadataType(GetType(CustomerMetaData))> _
    Partial Public Class Customer
    
    End Class
    
  10. 메타데이터 클래스에서 표시나 동작을 수정할 각 필드에 DataAnnotations 특성을 추가합니다.

    다음 예제에서는 Customer 테이블에 대한 완료된 partial 클래스 및 CustomerMetaData라는 연결된 메타데이터 클래스를 보여 줍니다. 이 메타데이터 클래스에는 데이터베이스 필드와 일치하는 public 클래스 필드가 포함되어 있습니다. PasswordHash 및 PasswordSalt 필드는 false로 설정된 ScaffoldColumnattribute 특성으로 표시되어 있습니다. 이로 인해 이 필드는 Dynamic Data를 통해 표시되지 않습니다. ModifiedDate 필드는 해당 값이 DataType.Date로 설정된 DataType 특성으로 표시되어 있습니다. 이는 이 필드의 데이터를 간단한 날짜 형식을 사용하여 표시하도록 지정합니다.

    using System.ComponentModel;
    using System.ComponentModel.DataAnnotations;
    
    [MetadataType(typeof(CustomerMetaData))]
    public partial class Customer { }
    
    public class CustomerMetaData {
    
       [ScaffoldColumn(false)]
        public object PasswordHash { get; set; }
    
        [ScaffoldColumn(false)]
        public object PasswordSalt { get; set; }
    
        [DataTypeAttribute(DataType.Date)]
        public object ModifiedDate { get; set; }   
    
    }
    
    Imports Microsoft.VisualBasic
    Imports System.ComponentModel
    Imports System.ComponentModel.DataAnnotations
    
    <MetadataType(GetType(CustomerMetaData))> _
    Partial Public Class Customer
    
    End Class
    
    Public Class CustomerMetaData
    
            <ScaffoldColumn(False)> _
        Public PasswordSalt As Object
    
        <DataTypeAttribute(DataType.Date)> _
    Public PasswordSalt As Object
    
        <DataTypeAttribute(DataType.Date)> _
    Public ModifiedDate As Object  
    End Class
    
  11. partial 클래스, 메타데이터 클래스 및 특성이 작동하는지 확인하려면 응용 프로그램을 실행하고 테이블을 표시합니다.

사용자 지정 데이터 특성을 사용하도록 필드 템플릿을 수정하려면

  1. 사용자 지정할 필드 템플릿을 엽니다. 기본 제공 템플릿을 사용자 지정하려면 Dynamic Data가 데이터를 매핑하는 데이터 형식에 해당하는 필드 템플릿을 엽니다.

    예를 들어 문자열 표시에 사용되는 필드 템플릿을 사용자 지정하는 경우 DynamicData\FieldTemplates 디렉터리에 있는 Text.ascx를 엽니다.

  2. 필요한 경우 태그를 변경합니다.

  3. 코드 숨김 파일에서 OnDataBinding 메서드를 재정의합니다. 이 메서드는 필드 템플릿 컨트롤이 표시할 데이터를 가져올 때 호출됩니다. 메서드에서, 필드 템플릿이 파생된 FieldTemplateUserControl 클래스의 MetadataAttributes 특성에서 현재 데이터 필드의 특성을 가져옵니다. 그런 다음 필드에 표시된 특성에 따라 데이터의 형식을 지정하거나 데이터를 처리할 수 있습니다.

    다음 예제에서는 이 항목의 앞부분에서 수정한 데이터 필드를 표시하기 위해 Text.ascx 필드 템플릿에서 사용할 수 있는 코드를 보여 줍니다.

    Imports System
    Imports System.Data
    Imports System.Configuration
    Imports System.Collections
    Imports System.Collections.Specialized
    Imports System.Linq
    Imports System.Web
    Imports System.Web.Security
    Imports System.Web.UI
    Imports System.Web.UI.WebControls
    Imports System.Web.UI.WebControls.WebParts
    Imports System.Web.UI.HtmlControls
    Imports System.Xml.Linq
    Imports System.Web.DynamicData
    Imports System.ComponentModel.DataAnnotations
    
    Partial Class TextField
        Inherits System.Web.DynamicData.FieldTemplateUserControl
    
        Private Function getNavUrl() As String
            Dim metadata = MetadataAttributes.OfType(Of DataTypeAttribute).FirstOrDefault()
            If (metadata Is Nothing) Then
                Return FieldValueString
            End If
    
            Dim url As String = FieldValueString
    
            Select Case metadata.DataType
    
                Case DataType.Url
                    url = FieldValueString
                    If (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) Or _
                       url.StartsWith("https://", StringComparison.OrdinalIgnoreCase)) Then
                        Return url
                    End If
    
                    Return "http://" + FieldValueString
    
                Case DataType.EmailAddress
                    Return "mailto:" + FieldValueString
    
                Case Else
                    Throw New Exception("Unknow DataType")
    
            End Select
    
        End Function
    
    
        Protected Overrides Sub OnDataBinding(ByVal e As System.EventArgs)
            MyBase.OnDataBinding(e)
    
            If (String.IsNullOrEmpty(FieldValueString)) Then
                Return
            End If
    
            Dim metadata = MetadataAttributes.OfType(Of DataTypeAttribute).FirstOrDefault()
    
            If (metadata Is Nothing Or String.IsNullOrEmpty(FieldValueString)) Then
                Dim literal As New Literal()
                literal.Text = FieldValueString
                Controls.Add(literal)
                Return
            End If
    
            If (metadata.DataType = DataType.Url Or _
                metadata.DataType = DataType.EmailAddress) Then
    
                Dim hyperlink As New HyperLink
                hyperlink.Text = FieldValueString
                hyperlink.href = getNavUrl()
                hyperlink.Target = "_blank"
                Controls.Add(hyperlink)
                Return
    
            End If
    
            If (metadata.DataType = DataType.Custom And _
                 String.Compare(metadata.CustomDataType, "BoldRed", True) = 0) Then
                Dim lbl As New Label()
                lbl.Text = FieldValueString
                lbl.Font.Bold = True
                lbl.ForeColor = System.Drawing.Color.Red
                Controls.Add(lbl)
            End If
    
        End Sub
    
    End Class
    
    using System;
    using System.Data;
    using System.Configuration;
    using System.Collections;
    using System.Collections.Specialized;
    using System.Linq;
    using System.Web;
    using System.Web.Security;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    using System.Web.UI.WebControls.WebParts;
    using System.Web.UI.HtmlControls;
    using System.Xml.Linq;
    using System.Web.DynamicData;
    using System.ComponentModel.DataAnnotations;
    
    public partial class TextField : System.Web.DynamicData.FieldTemplateUserControl {
    
        string getNavUrl() {
    
            var metadata = MetadataAttributes.OfType<DataTypeAttribute>().FirstOrDefault();
            if (metadata == null)
                return FieldValueString; 
    
            switch (metadata.DataType) {
    
                case DataType.Url:
                    string url = FieldValueString;
                    if (url.StartsWith("http://", StringComparison.OrdinalIgnoreCase) ||
                        url.StartsWith("https://", StringComparison.OrdinalIgnoreCase))
                        return url;
    
                    return "http://" + FieldValueString;
    
    
                case DataType.EmailAddress:
                    return "mailto:" + FieldValueString;
    
                default:
                    throw new Exception("Unknown DataType");
            }
        }
    
        protected override void OnDataBinding(EventArgs e) {
            base.OnDataBinding(e);
    
            if (string.IsNullOrEmpty(FieldValueString))
                return;
    
            var metadata = MetadataAttributes.OfType<DataTypeAttribute>().FirstOrDefault();
    
            if (metadata == null || string.IsNullOrEmpty(FieldValueString)) {
                Literal literal = new Literal();
                literal.Text = FieldValueString;
                Controls.Add(literal);
                return;
            }
    
            if (metadata.DataType == DataType.Url ||
                metadata.DataType == DataType.EmailAddress) {
    
                HyperLink hyperlink = new HyperLink();
                hyperlink.Text = FieldValueString;
                hyperlink.href = getNavUrl();
                hyperlink.Target = "_blank";
                Controls.Add(hyperlink);
                return;
            }
    
            if (metadata.DataType == DataType.Custom &&
               string.Compare(metadata.CustomDataType, "BoldRed", true) == 0) {
                Label lbl = new Label();
                lbl.Text = FieldValueString;
                lbl.Font.Bold = true;
                lbl.ForeColor = System.Drawing.Color.Red;
                Controls.Add(lbl);
            }
    
        }
    
    }
    

    이 코드는 현재 필드의 특성을 가져와서 특성을 테스트한 다음 필드에 표시되어 있는 특성에 따라 서로 다른 논리를 실행합니다. 예를 들어 이 코드는 Custom()을 테스트한 다음 CustomDataType() 속성이 "BoldRed"인지 테스트하여 필드가 사용자 지정 BoldRed 특성으로 표시되어 있는지 확인할 수 있습니다. 이 특성으로 표시되어 있으면 빨간색 텍스트로 스타일이 지정된 Label 컨트롤에 데이터를 표시하기 위한 UI를 만듭니다.

예제

다음 예제에서는 내장 형식이 아닌 데이터 형식에 대한 데이터 필드 모양 및 동작을 사용자 지정하는 방법을 보여 줍니다. 이 코드에서는 Dynamic Data가 AdventureWorksLT 데이터베이스의 Customer 테이블에 있는 EmailAddress, SalesPerson 및 LastName 필드를 표시하는 방법을 사용자 지정합니다.

Imports System.ComponentModel
Imports System.ComponentModel.DataAnnotations

<MetadataType(GetType(CustomerMetaData))> _
Partial Public Class Customer

End Class


Public Class CustomerMetaData

    <ScaffoldColumn(False)> _
    Public PasswordHash As Object

    <ScaffoldColumn(False)> _
    Public PasswordSalt As Object

    <DataTypeAttribute(DataType.Date)> _
    Public ModifiedDate As Object

    <DataTypeAttribute(DataType.EmailAddress)> _
    Public EmailAddress As Object

    <DataTypeAttribute(DataType.Url)> _
    Public SalesPerson As Object


    <DataTypeAttribute("BoldRed")> _
    <DisplayName("Last")> _
    Public ReadOnly Property LastName() As Object
        Get
            Return ""
        End Get
    End Property

End Class
using System.ComponentModel;
using System.ComponentModel.DataAnnotations;

[MetadataType(typeof(CustomerMetaData))]
public partial class Customer {
}

public class CustomerMetaData {

    [ScaffoldColumn(false)]
    public object PasswordHash { get; set; }

    [ScaffoldColumn(false)]
    public object PasswordSalt { get; set; }

    [DataTypeAttribute(DataType.Date)]
    public object ModifiedDate { get; set; }

    [DataTypeAttribute(DataType.EmailAddress)]
    public object EmailAddress { get; set; }

    [DataTypeAttribute(DataType.Url)]
    public object SalesPerson { get; set; }

    [DisplayName("Last")]
    [DataTypeAttribute("BoldRed")]
    [RegularExpression(@"^[a-zA-Z''-'\s]{1,40}$", 
        ErrorMessage = "Characters are not allowed.")]

    public object LastName { get; set; }
} 

예제에서 EmailAddress 속성에 대해 DataTypeAttribute 특성이 EmailAddress()로 설정되어 있습니다. SalesPerson 속성에 대해서는 DataTypeAttribute 특성이 Url()로 설정되어 있고, LastName 속성에 대해서는 DataTypeAttribute 특성이 BoldRed로 설정되어 있습니다. BoldRed는 사용자 지정 속성으로 정의되어 있습니다.

코드 컴파일

예제 코드를 컴파일하려면 다음이 필요합니다.

  • Microsoft Visual Studio 2008 서비스 팩 1 또는 Visual Web Developer 2008 Express Edition 서비스 팩 1

  • AdventureWorksLT 샘플 데이터베이스. SQL Server 샘플 데이터베이스를 다운로드 및 설치하는 방법에 대한 자세한 내용은 CodePlex 사이트의 Microsoft SQL Server Product Samples: Database를 참조하십시오. 실행 중인 SQL Server 버전(Microsoft SQL Server 2005 또는 Microsoft SQL Server 2008)에 맞는 올바른 샘플 데이터베이스 버전을 설치해야 합니다.

  • Dynamic Data 구동 웹 사이트. 이를 통해 데이터베이스의 데이터 컨텍스트를 만드는 것은 물론 사용자 지정할 데이터 필드와 재정의할 메서드가 들어 있는 클래스를 만들 수 있습니다. 자세한 내용은 Walkthrough: Creating a New Dynamic Data Web Site using Scaffolding를 참조하십시오.

참고 항목

작업

방법: ASP.NET Dynamic Data 기본 필드 템플릿 사용자 지정

변경 기록

날짜

변경 내용

이유

2008년 7월

항목이 추가되었습니다.

SP1 기능 변경