다음을 통해 공유


방법: 데이터 유효성 검사

이 항목에서는 속성과 엔터티에 유효성 검사 특성을 추가하여 유효성 검사 규칙을 적용하는 방법에 대해 설명합니다. WCF RIA Services에서는 일반적인 유효성 검사를 수행하는 여러 가지 유효성 검사 특성을 제공하며, 사용자 지정된 유효성 검사를 지정할 수 있도록 CustomValidationAttribute 특성도 제공합니다.

RIA Services 에서 제공하는 기본 유효성 검사 특성은 다음과 같습니다.

서버 프로젝트의 엔터티에 유효성 검사 특성을 추가하면 생성된 클라이언트 엔터티 표현에 해당 유효성 검사 특성이 전파됩니다. 런타임 시 사용자의 데이터에 유효성 검사 규칙이 적용됩니다. 유효성 검사 특성을 추가하려면 메타데이터 클래스를 추가해야 합니다. 이 작업을 수행하는 방법에 대한 자세한 내용은 방법: 메타데이터 클래스 추가를 참조하십시오.

이 항목에서는 기본 및 사용자 지정 유효성 검사 특성을 추가하는 방법에 대해 설명합니다.

RIA 서비스에서 제공하는 유효성 검사 특성을 추가하려면

  1. 방법: 메타데이터 클래스 추가에 설명된 대로 엔터티 클래스의 메타데이터 클래스를 추가합니다.

  2. 유효성을 검사할 속성 또는 엔터티에서 유효성 검사를 수행하는 유효성 검사 특성을 추가합니다.

    다음 예제에서는 AddressLine1이라는 속성에 적용된 RequiredAttributeStringLengthAttribute 특성을 보여 줍니다.

    <Required()> _
    <StringLength(60)> _
    <RoundtripOriginal()> _
    Public AddressLine1 As String
    
    [Required]
    [StringLength(60)]
    [RoundtripOriginal]
    public string AddressLine1 { get; set; }
    
  3. Ctrl+Shift+B를 눌러 솔루션을 빌드합니다.

  4. Silverlight응용 프로그램에서 Generated_Code 폴더에 생성된 코드 파일을 열고 클라이언트 코드에서 유효성 검사 특성이 어떻게 적용되었는지 확인합니다.

사용자 지정 유효성 검사 특성을 추가하려면

  1. 방법: 메타데이터 클래스 추가에 설명된 대로 엔터티 클래스의 메타데이터 클래스를 추가합니다.

  2. *.shared.cs 또는 *.shared.vb명명 패턴을 사용하여 공유 코드 파일을 추가합니다.

    코드 파일에 사용자 지정 유효성 검사 개체가 포함됩니다.

  3. 데이터가 유효한지 여부를 결정하는 메서드를 추가합니다.

    메서드는 public이고 static(또는 Visual Basic의 경우 Public이고 Shared)이어야 하며, ValidationResult를 반환하여 유효성 검사의 결과를 나타내야 합니다. 사용자 지정 유효성 검사 클래스를 정의할 때 클라이언트 프로젝트에서 클래스가 올바르게 생성되려면 최소한 자동 구현된 속성 이외의 다른 몇 가지 코드를 제공해야 합니다.

    다음 예제에서는 Product 엔터티의 유효성을 검사하는 IsProductValid 메서드와 함께 ProductValidator 클래스를 보여 줍니다. 데이터가 유효하지 않으면 오류 메시지와 유효성 검사에 실패한 속성의 이름을 반환합니다.

    Imports System.ComponentModel.DataAnnotations
    
    Public Class ProductValidator
        Public Shared Function IsProductValid(ByVal productToValidate As Product, ByVal context As ValidationContext)
            If (productToValidate.ListPrice < (CDec(0.8) * productToValidate.StandardCost)) Then
                Return New ValidationResult("ListPrice is below 80 percent of StandardCost.", New String() {"ListPrice"})
            Else
                Return ValidationResult.Success
            End If
        End Function
    End Class
    
    using System;
    using System.ComponentModel.DataAnnotations;
    
    namespace RIAServicesExample.Web
    {
        public class ProductValidator
        {
            public static ValidationResult IsProductValid(Product productToValidate, ValidationContext context)
            {
                if (productToValidate.ListPrice < ((decimal).8 * productToValidate.StandardCost))
                {
                    return new ValidationResult("ListPrice is below 80 percent of StandardCost.", new string[] { "ListPrice" });
                }
                else
                {
                    return ValidationResult.Success;
                }
            }
        }
    }
    
  4. 유효성을 검사할 엔터티나 속성에서 CustomValidationAttribute 특성을 추가하고 유효성 검사 개체의 형식과 유효성 검사를 수행하는 메서드의 이름을 전달합니다.

    다음 예제에서는 엔터티에 적용된 CustomValidationAttribute 특성을 보여 줍니다. 유효성 검사 개체 형식은 ProductValidator이고 메서드는 IsProductValid입니다.

    <CustomValidation(GetType(ProductValidator), "IsProductValid")> _
    <MetadataTypeAttribute(GetType(Product.ProductMetadata))> _
    Partial Public Class Product
        Friend NotInheritable Class ProductMetadata
    
            'Metadata classes are not meant to be instantiated.
            Private Sub New()
                MyBase.New()
            End Sub
    
            Public Color As String
    
            Public DiscontinuedDate As Nullable(Of DateTime)
    
            Public ListPrice As Decimal
    
            Public ModifiedDate As DateTime
    
            Public Name As String
    
            Public ProductCategoryID As Nullable(Of Integer)
    
            Public ProductID As Integer
    
            Public ProductModelID As Nullable(Of Integer)
    
            Public ProductNumber As String
    
            Public rowguid As Guid
    
            Public SellEndDate As Nullable(Of DateTime)
    
            Public SellStartDate As DateTime
    
            <Required()> _
            <StringLength(20)> _
            Public Size As String
    
            Public StandardCost As Decimal
    
            Public ThumbNailPhoto() As Byte
    
            Public ThumbnailPhotoFileName As String
    
            Public Weight As Nullable(Of Decimal)
        End Class
    End Class
    
    [CustomValidation(typeof(ProductValidator), "IsProductValid")]
    [MetadataTypeAttribute(typeof(Product.ProductMetadata))]
    public partial class Product
    {
    
        internal sealed class ProductMetadata
        {
    
            // Metadata classes are not meant to be instantiated.
            private ProductMetadata()
            {
            }
    
            public string Color;
    
            public Nullable<DateTime> DiscontinuedDate;
    
            public decimal ListPrice;
    
            public DateTime ModifiedDate;
    
            public string Name;
    
            public Nullable<int> ProductCategoryID;
    
            public int ProductID;
    
            public Nullable<int> ProductModelID;
    
            public string ProductNumber;
    
            public Guid rowguid;
    
            public Nullable<DateTime> SellEndDate;
    
            public DateTime SellStartDate;
    
            [Required()]
            [StringLength(20)]
            public string Size;
    
            public decimal StandardCost;
    
            public byte[] ThumbNailPhoto;
    
            public string ThumbnailPhotoFileName;
    
            public Nullable<decimal> Weight;
        }
    }
    
  5. Ctrl+Shift+B를 눌러 솔루션을 빌드합니다.

  6. Silverlight 응용 프로그램에서 Generated_Code 폴더를 엽니다. 공유 코드 파일이 폴더에 있고 엔터티에 CustomValidationAttribute가 어떻게 적용되는지 확인합니다.