如何:验证数据

本主题介绍如何向属性和实体添加验证特性以便强制实施验证规则。WCF RIA Services 提供若干执行常见验证检查的验证特性,并且还提供 CustomValidationAttribute 特性以使您能够指定自定义的验证检查。

RIA Services 提供以下默认的验证特性:

您向服务器项目中的实体添加验证特性,并且这些验证特性将传播到其生成的客户端实体表示形式中。在运行时,这些验证规则将应用于来自用户的数据。您必须添加元数据类以便添加验证特性。有关如何执行该操作的更多信息,请参见如何:添加元数据类

本主题介绍如何添加默认和自定义验证特性。

添加 RIA Services 提供的验证特性

  1. 为实体类添加一个元数据类,如如何:添加元数据类中所述。

  2. 在您要验证的属性或实体上,添加执行验证的验证特性。

    下面的示例演示 RequiredAttributeStringLengthAttribute 特性是如何应用于名为 AddressLine1 的属性的。

    <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. 添加一个方法,该方法确定数据是否有效。

    该方法必须为 publicstatic(在 Visual Basic 中必须为 PublicShared)。它必须返回 ValidationResult,以便指示验证检查的结果。在您定义自定义的验证类时,除了自动实现的属性外,您还必须至少提供一些代码,以便在客户端项目中正确生成该类。

    下面的示例演示一个名为 ProductValidator 的类,该类有一个验证 Product 实体的方法 IsProductValid。当数据无效时, 将返回错误消息以及未通过验证的属性的名称。

    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 是如何应用于该实体的。