次の方法で共有


方法: データを検証する

ここでは、プロパティやエンティティに検証属性を追加して検証規則を適用する方法について説明します。WCF RIA サービス では、一般的な検証チェックを実行するいくつかの検証属性に加え、カスタマイズされた検証チェックを指定できるように CustomValidationAttribute 属性も提供されています。

RIA サービス で提供されている既定の検証属性を次に示します。

サーバー プロジェクトのエンティティに検証属性を追加すると、追加した検証属性は、生成されるクライアント エンティティ表現に反映されます。実行時には、検証規則がユーザーのデータに適用されます。検証属性を追加するには、メタデータ クラスを追加する必要があります。この手順の詳細については、「方法: メタデータ クラスを追加する」を参照してください。

ここでは、既定の検証属性とカスタム検証属性を追加する方法について説明します。

RIA Services で提供される検証属性を追加するには

  1. 方法: メタデータ クラスを追加する」の説明に従って、エンティティ クラスのメタデータ クラスを追加します。

  2. 検証するプロパティまたはエンティティで、検証を実行する検証属性を追加します。

    次の例は、AddressLine1 という名前のプロパティに適用される RequiredAttribute 属性および StringLengthAttribute 属性を示します。

    <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 がエンティティに適用されていることを確認します。