방법: 데이터 모델의 데이터 필드 유효성 검사 사용자 지정
업데이트: 2008년 7월
ASP.NET Dynamic Data를 사용하면 데이터 유효성 검사를 사용자 지정하고 데이터 모델로 확장할 수 있습니다. 이 항목에서는 다음과 같이 데이터 모델에서 데이터 필드 유효성 검사를 추가하는 방법을 설명합니다.
Dynamic Data System.ComponentModel.DataAnnotations 특성을 필드에 적용하여 개별 데이터 필드에 대한 유효성 검사 사용자 지정. 이러한 특성은 범위 확인 및 필수 필드와 같은 일반적인 유효성 검사 패턴을 정의합니다. 이 방법을 사용하면 간단한 코딩 작업만으로도 미리 정의된 유효성 검사를 사용할 수 있습니다. Dynamic Data에서 기본으로 제공하는 유효성 검사에 추가 유효성 검사를 적용하려는 경우 및 기본 System.ComponentModel.DataAnnotations 특성만으로도 요구 사항을 충족할 수 있는 경우 이 방법을 사용해야 합니다.
참고: 또한 사용자 지정 유효성 검사 특성을 만들 수도 있습니다. 이 방법을 사용하면 System.ComponentModel.DataAnnotations 특성이 제공하는 유효성 검사를 확장할 수 있습니다. 이 방법은 사용 가능한 특성이 특정 데이터 필드의 유효성 검사 요구 사항을 충족하지 못하는 경우에 유용합니다. 자세한 내용은 방법: 사용자 지정 특성을 사용하여 데이터 모델의 데이터 필드 유효성 검사 사용자 지정을 참조하십시오.
데이터 필드의 변경 내용을 처리하는 partial 클래스 메서드를 재정의하거나 해당 이벤트를 처리하여 개별 데이터 필드에 대한 유효성 검사 사용자 지정. 이 방법을 사용하면 개별 필드에 대한 유효성 검사 및 비즈니스 논리를 추가할 수 있습니다.
OnValidate 메서드를 재정의하거나 Validate 이벤트를 처리하여 모든 데이터 필드에 대한 유효성 검사 사용자 지정. 이 메서드는 테이블의 데이터 필드가 처리될 때 호출됩니다. 이 방법은 개별 필드에 대한 유효성 검사를 추가하는 방법보다 보편적으로 사용되는 방법이며 여러 데이터 필드에 동일한 유효성 검사 논리를 적용할 수 있는 경우에 유용합니다. 이 방법을 사용하면 여러 필드를 대상으로 유효성 검사를 수행할 수도 있습니다.
데이터 모델에서 throw되는 모든 유효성 검사 예외는 DynamicValidator 컨트롤에서 catch됩니다. 페이지에 DynamicValidator 컨트롤이 들어 있으면 페이지에 오류가 표시될 수 있습니다.
- 데이터 모델에 추가한 모든 유효성 검사에 대해 데이터 모델의 테이블 클래스를 확장하는 partial 클래스를 만들어야 합니다. 그런 다음 partial 클래스에 유효성 검사를 추가합니다.
이 기능의 온라인 예제를 실행해 보십시오.
유효성 검사를 위한 partial 클래스 만들기
데이터 모델 계층에서 유효성 검사를 사용자 지정하려면 먼저 데이터 모델을 확장하는 partial 클래스를 구현해야 합니다. 이를 통해 다음과 같은 작업을 수행할 수 있습니다.
특성을 통해 메타데이터 정보를 추가하여 유효성 검사를 사용자 지정합니다.
고유의 유효성 검사 논리를 만들 수 있도록 지원하는 partial 클래스 메서드를 구현하여 유효성 검사를 사용자 지정합니다.
유효성 검사를 위한 partial 클래스를 만들려면
솔루션 탐색기에서 App_Code 폴더를 마우스 오른쪽 단추로 클릭한 다음 새 항목 추가를 클릭합니다.
Visual Studio에 설치되어 있는 템플릿에서 클래스를 클릭합니다.
이름 상자에 유효성 검사를 추가할 데이터 테이블의 이름을 입력합니다.
클래스 이름은 테이블을 나타내는 엔터티 클래스 이름과 일치해야 합니다. 예를 들어 Customers 테이블에 대한 유효성 검사를 추가하려면 파일 이름을 Customer.cs(Visual C#의 경우) 또는 Customer.vb(Visual Basic의 경우)로 지정하고 클래스 이름을 Customer로 지정해야 합니다.
클래스 정의를 partial 클래스로 만들려면 해당 클래스 정의에 Visual Basic의 Partial 키워드 또는 Visual C#의 partial 키워드를 추가합니다.
다음 예제에서는 업데이트된 클래스 선언을 보여 줍니다.
public partial class Customer { }
Partial Public Class Customer End Class
Visual C#에 클래스를 만드는 경우 기본 생성자를 삭제합니다.
다음 예제에서처럼 Visual Basic의 Imports 키워드 또는 Visual C#의 using 키워드를 사용하여 System.Web.DynamicData 및 System.ComponentModel.DataAnnotations 네임스페이스에 대한 참조를 추가합니다.
using System.Web.DynamicData; using System.ComponentModel.DataAnnotations;
Imports System.Web.DynamicData Imports System.ComponentModel.DataAnnotations
연결된 메타데이터 클래스로 사용할 두 번째 클래스를 같은 파일에 만듭니다. 이 클래스에는 이전에 사용하지 않은 모든 올바른 클래스 이름을 사용할 수 있습니다.
다음 예제에서는 메타데이터 클래스 선언을 보여 줍니다.
[C#]
public class CustomerMetadata { }
Public Class CustomerMetadata End Class
연결된 메타데이터 클래스는 유효성 검사 특성을 적용할 수 있는 개체를 제공합니다.
MetadataTypeAttribute 특성을 partial 클래스 정의에 적용합니다. 특성의 매개 변수에 대해서는 이전 단계에서 만든 연결된 메타데이터 클래스의 이름을 사용합니다.
다음 예제에서는 특성이 추가된 partial 클래스 정의를 보여 줍니다.
[MetadataType(typeof(CustomerMetadata))] public partial class Customer { }
<MetadataType(GetType(CustomerMetadata))> _ Partial Public Class Customer End Class
특성을 사용하여 유효성 검사 사용자 지정
이 단원에서는 Dynamic Data System.ComponentModel.DataAnnotations 특성이 제공하는 기본 유효성 검사 규칙을 사용하여 유효성 검사를 사용자 지정하는 방법을 보여 줍니다.
유효성 검사 특성을 사용하여 특정 데이터 필드의 유효성을 검사하려면
메타데이터 클래스에서 유효성을 검사할 데이터 필드와 이름이 일치하는 속성 또는 필드를 만듭니다.
System.ComponentModel.DataAnnotations 네임스페이스의 특성 중 하나를 속성에 적용합니다.
다음 예제에서는 연결된 메타데이터 클래스의 Title 데이터 필드에 System.ComponentModel.DataAnnotations.RequiredAttribute 특성을 적용하는 방법을 보여 줍니다. 사용자가 빈 문자열을 입력하면 IsValid 메서드가 유효성 검사 예외를 throw하고 오류 메시지를 생성합니다.
참고: RequiredAttribute 특성을 적용하여 값 입력이 데이터베이스의 요구 사항이 아니더라도 사용자가 값을 입력하도록 지정합니다.
public class CustomerMetadata { [Required()] public object Title; }
Public Class CustomerMetadata <Required()> _ Public Title As Object End Class
partial 클래스 메서드를 사용하여 개별 데이터 필드에 대한 유효성 검사 사용자 지정
이 단원에서는 개별 데이터 필드의 변경 내용을 처리하는 partial 클래스 메서드를 재정의하여 유효성 검사를 사용자 지정하는 방법을 보여 줍니다. 이러한 형식의 유효성 검사를 사용하면 System.ComponentModel.DataAnnotations 특성에 구현된 Dynamic Data의 기본 제공 유효성 검사를 사용하는 대신 유효성 검사를 수행하는 규칙을 직접 만들 수 있습니다.
partial 클래스 메서드를 사용하여 특정 데이터 필드의 유효성을 검사하려면
데이터 필드의 변경 내용을 처리하는 partial 클래스 메서드를 재정의합니다.
사용자 지정 유효성 검사 논리를 추가합니다.
다음 예제에서는 partial Customer 클래스의 OnTitleChanging 메서드를 재정의하는 방법을 보여 줍니다. 이 메서드는 Customer 데이터 테이블의 Title 필드가 변경될 때 호출됩니다. 다음 예제의 코드는 사용자가 입력한 새 직함이 대문자로 시작하는지 확인합니다. 해당 데이터가 유효성 검사를 통과하지 못하면 메서드가 예외를 throw합니다. 유효성을 검사할 값이 유일한 매개 변수로 메서드에 전달됩니다. 이 매개 변수는 유효성을 검사할 데이터의 데이터 형식과 일치하도록 입력됩니다.
참고: 데이터 모델에서 throw되는 모든 유효성 검사 예외는 DynamicValidator 컨트롤에서 catch됩니다. 페이지에 DynamicValidator 컨트롤이 들어 있으면 페이지에 오류가 표시될 수 있습니다.
public partial class Customer { partial void OnTitleChanging(string value) { if (!Char.IsUpper(value[0])) { throw new ValidationException( "Title must start with an uppercase letter.");} } }
Public Partial Class Customer Private Sub OnTitleChanging(ByVal value As String) If Not [Char].IsUpper(value(0)) Then Throw New ValidationException( _ "Title must start with an uppercase letter.") End If End Sub End Class
partial 클래스 메서드를 사용하여 모든 데이터 필드에 대한 유효성 검사 사용자 지정
이 단원에서는 테이블 내 모든 데이터 필드의 변경 내용을 처리하는 partial 클래스 메서드를 재정의하여 유효성 검사를 사용자 지정하는 방법을 보여 줍니다. 이러한 형식의 유효성 검사를 사용하면 System.ComponentModel.DataAnnotations 특성에 구현된 Dynamic Data의 기본 제공 유효성 검사를 사용하는 대신 유효성 검사를 수행하는 규칙을 직접 만들 수 있습니다. 이 방법은 여러 데이터 필드에 동일한 유효성 검사 논리를 적용할 수 있는 경우에 유용합니다. 이 방법을 사용하면 여러 필드를 대상으로 유효성 검사를 수행할 수도 있습니다.
partial 클래스 메서드를 사용하여 데이터 필드의 유효성을 검사하려면
테이블의 데이터 필드가 변경될 때 호출되는 OnValidate partial 클래스 메서드를 재정의합니다.
사용자 지정 유효성 검사 논리를 추가합니다.
다음 예제에서는 OnValidate 메서드를 재정의하는 방법을 보여 줍니다. 이 예제 코드는 사용자가 입력한 이름과 성이 대문자로 시작하는지 확인합니다. 해당 데이터가 유효성 검사를 통과하지 못하면 메서드가 예외를 throw합니다.
참고: 데이터 모델에서 throw되는 모든 유효성 검사 예외는 DynamicValidator 컨트롤에서 catch됩니다. 페이지에 DynamicValidator 컨트롤이 들어 있으면 페이지에 오류가 표시될 수 있습니다.
partial void OnValidate( System.Data.Linq.ChangeAction action) { if (!Char.IsUpper(this._LastName[0]) || !Char.IsUpper(this._FirstName[0])) throw new ValidationException( "Name must start with an uppercase letter."); }
Private Sub OnValidate(ByVal action As _ System.Data.Linq.ChangeAction) If Not [Char].IsUpper(Me._LastName(0)) OrElse _ Not [Char].IsUpper(Me._FirstName(0)) Then Throw New ValidationException( _ "Name must start with an uppercase letter.") End If End Sub
예제
다음 예제에서는 RequiredAttribute 특성을 사용하여 Customer 테이블에 있는 Title 데이터의 유효성을 검사하는 방법을 보여 줍니다. 이 예제에서는 OnValidate partial 클래스 메서드를 사용하여 사용자가 Title, FirstName 및 LastName 데이터 필드에 입력한 값이 대문자로 시작하는지 확인합니다. 또한 OnOderQtyChanging partial 클래스 메서드를 사용하여 사용자가 SalesOrderDetails 테이블의 OrderQty 데이터 필드에 입력한 값이 지정된 최소값보다 큰지 확인합니다.
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations
<MetadataType(GetType(CustomerMetadata))> _
Partial Public Class Customer
Private Sub OnValidate(ByVal action As System.Data.Linq.ChangeAction)
If Not Char.IsUpper(Me._LastName(0)) _
OrElse Not Char.IsUpper(Me._FirstName(0)) _
OrElse Not Char.IsUpper(Me._Title(0)) Then
Throw New ValidationException( _
"Data value must start with an uppercase letter.")
End If
End Sub
End Class
Public Class CustomerMetadata
<Required()> _
Public Title As Object
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;
[MetadataType(typeof(CustomerMetadata))]
public partial class Customer
{
partial void OnValidate(System.Data.Linq.ChangeAction action)
{
if (!char.IsUpper(this._LastName[0]) ||
!char.IsUpper(this._FirstName[0]) ||
!char.IsUpper(this._Title[0]))
throw new ValidationException(
"Data value must start with an uppercase letter.");
}
}
public class CustomerMetadata
{
[Required()]
public object Title;
}
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Web
Imports System.Web.DynamicData
Imports System.ComponentModel.DataAnnotations
Partial Public Class SalesOrderDetail
Private Sub OnOrderQtyChanging(ByVal value As Short)
If value < 100 Then
Throw New ValidationException( _
"Quantity is less than the allowed minimum of 100.")
End If
End Sub
End Class
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.DynamicData;
using System.ComponentModel.DataAnnotations;
public partial class SalesOrderDetail
{
partial void OnOrderQtyChanging(short value)
{
if (value < 100)
{
throw new ValidationException(
"Quantity is less than the allowed minimum of 100.");
}
}
}
<%@ Page Language="VB"
AutoEventWireup="true" CodeFile="CustomValidation.aspx.vb"
Inherits="CustomValidation" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
<title></title>
<link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Example: <%=Title%></h2>
<!-- Enable dynamic behavior. The GridView must be
registered with the manager. See code-behind file. -->
<asp:DynamicDataManager ID="DynamicDataManager1"
AutoLoadForeignKeys="true" />
<form id="form1" >
<!-- Capture validation exceptions -->
<asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1"
/>
<asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2"
/>
<table>
<tr>
<td align="left" valign="top" style="font-weight:bold">
Customize Validation Using the Table OnValidate
</td>
<td>
<asp:GridView ID="GridView1"
DataSourceID="GridDataSource"
AutoGenerateColumns="false"
AutoGenerateEditButton="true"
AllowPaging="true"
PageSize="5"
AllowSorting="true">
<Columns>
<asp:DynamicField DataField="Title" />
<asp:DynamicField DataField="FirstName" />
<asp:DynamicField DataField="LastName" />
</Columns>
<EmptyDataTemplate>
There are currently no items in this table.
</EmptyDataTemplate>
</asp:GridView>
</td>
</tr>
<tr>
<td align="left" valign="top" style="font-weight:bold">
Customize Validation Using OnOrderQtyChanging
</td>
<td>
<asp:GridView ID="GridView2"
DataSourceID="GridDataSource2"
AutoGenerateColumns="false"
AutoGenerateEditButton="true"
AllowPaging="true"
PageSize="5"
AllowSorting="true">
<Columns>
<asp:DynamicField DataField="OrderQty" />
</Columns>
<EmptyDataTemplate>
There are currently no items in this table.
</EmptyDataTemplate>
</asp:GridView>
</td>
</tr>
</table>
</form>
<!-- Connect to the database -->
<asp:LinqDataSource ID="GridDataSource"
TableName="Customers" EnableUpdate="true"
ContextTypeName="AdventureWorksLTDataContext">
</asp:LinqDataSource>
<!-- Connect to the database -->
<asp:LinqDataSource ID="GridDataSource2"
TableName="SalesOrderDetails" EnableUpdate="true"
ContextTypeName="AdventureWorksLTDataContext">
</asp:LinqDataSource>
</body>
</html>
<%@ Page Language="C#"
AutoEventWireup="true" CodeFile="CustomValidation.aspx.cs"
Inherits="CustomValidation" %>
<html xmlns="http://www.w3.org/1999/xhtml">
<head id="Head1" >
<title></title>
<link href="~/Site.css" rel="stylesheet" type="text/css" />
</head>
<body>
<h2>Example: <%=Title%></h2>
<!-- Enable dynamic behavior. The GridView must be
registered with the manager. See code-behind file. -->
<asp:DynamicDataManager ID="DynamicDataManager1"
AutoLoadForeignKeys="true" />
<form id="form1" >
<!-- Capture validation exceptions -->
<asp:DynamicValidator ID="ValidatorID" ControlToValidate="GridView1"
/>
<asp:DynamicValidator ID="DynamicValidator1" ControlToValidate="GridView2"
/>
<table>
<tr>
<td align="left" valign="top" style="font-weight:bold">
Customize Validation Using the Table OnValidate
</td>
<td>
<asp:GridView ID="GridView1"
DataSourceID="GridDataSource"
AutoGenerateColumns="false"
AutoGenerateEditButton="true"
AllowPaging="true"
PageSize="5"
AllowSorting="true">
<Columns>
<asp:DynamicField DataField="Title" />
<asp:DynamicField DataField="FirstName" />
<asp:DynamicField DataField="LastName" />
</Columns>
<EmptyDataTemplate>
There are currently no items in this table.
</EmptyDataTemplate>
</asp:GridView>
</td>
</tr>
<tr>
<td align="left" valign="top" style="font-weight:bold">
Customize Validation Using OnOrderQtyChanging
</td>
<td>
<asp:GridView ID="GridView2"
DataSourceID="GridDataSource2"
AutoGenerateColumns="false"
AutoGenerateEditButton="true"
AllowPaging="true"
PageSize="5"
AllowSorting="true">
<Columns>
<asp:DynamicField DataField="OrderQty" />
</Columns>
<EmptyDataTemplate>
There are currently no items in this table.
</EmptyDataTemplate>
</asp:GridView>
</td>
</tr>
</table>
</form>
<!-- Connect to the database -->
<asp:LinqDataSource ID="GridDataSource"
TableName="Customers" EnableUpdate="true"
ContextTypeName="AdventureWorksLTDataContext">
</asp:LinqDataSource>
<!-- Connect to the database -->
<asp:LinqDataSource ID="GridDataSource2"
TableName="SalesOrderDetails" EnableUpdate="true"
ContextTypeName="AdventureWorksLTDataContext">
</asp:LinqDataSource>
</body>
</html>
Imports System
Imports System.Collections
Imports System.Configuration
Imports System.Web.DynamicData
Partial Public Class CustomValidation
Inherits System.Web.UI.Page
Protected _table1 As MetaTable, _table2 As MetaTable
Protected Sub Page_Init(ByVal sender As Object, ByVal e As EventArgs)
' Register data controls with the data manager.
DynamicDataManager1.RegisterControl(GridView1)
DynamicDataManager1.RegisterControl(GridView2)
End Sub
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
' Get the table entities.
_table1 = GridDataSource.GetTable()
_table2 = GridDataSource2.GetTable()
' Assign title dynamically.
Title = String.Concat("Customize Validation of the ", _
_table1.Name, " and ", _table2.Name, " Tables")
End Sub
End Class
using System;
using System.Collections;
using System.Configuration;
using System.Web.DynamicData;
public partial class CustomValidation : System.Web.UI.Page
{
protected MetaTable _table1, _table2;
protected void Page_Init(object sender, EventArgs e)
{
// Register data controls with the data manager.
DynamicDataManager1.RegisterControl(GridView1);
DynamicDataManager1.RegisterControl(GridView2);
}
protected void Page_Load(object sender, EventArgs e)
{
// Get the table entities.
_table1 = GridDataSource.GetTable();
_table2 = GridDataSource2.GetTable();
// Assign title dynamically.
Title = string.Concat("Customize Validation of the ",
_table1.Name, " and ", _table2.Name, " Tables");
}
}
코드 컴파일
예제 코드를 컴파일하려면 다음이 필요합니다.
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 필드 템플릿 개요
참조
Partial 클래스 및 메서드(C# 프로그래밍 가이드)
변경 기록
날짜 |
변경 내용 |
이유 |
---|---|---|
2008년 7월 |
항목이 추가되었습니다. |
SP1 기능 변경 |