How to: Validate Data
[ This document was written for WCF Services Version 1 Service Pack 2 and might not be up to date Please see Release Notes or Changelog for a list of changes since WCF RIA Services ]
This topic describes how you add validation attributes to properties and entities to enforce validation rules. Open Ria Services provides several validation attributes that perform common validation checks, and also provides the CustomValidationAttribute attribute to enable you to specify customized validation checks.
The following default validation attributes are provided by Open Ria Services:
You add the validation attributes to entities in the server project and those validation attribute are propagated to their generated client entity representations. At runtime, the validation rules are applied to data from the user. You must add metadata classes to add validation attributes. For more information on how to do this, see How to: Add Metadata Classes.
This topic describes how to add default and custom validation attributes.

To add validation attributes provided by Open Ria Services

  1. 1.
    Add a metadata class for the entity class, as described in How to: Add Metadata Classes.
  2. 2.
    On the properties or entity that you want to validate, add the validation attributes that perform the validation.
    The following example shows the RequiredAttribute and StringLengthAttribute attributes applied to a property named AddressLine1.
    <Required()> _
    <StringLength(60)> _
    Public AddressLine1 As String
    [Required]
    [StringLength(60)]
    public string AddressLine1;
  3. 3.
    Build (Ctrl+Shift+B) the solution.
  4. 4.
    In the Silverlight application, open the generated code file in the Generated_Code folder, and notice how the validation attributes have been applied in the client code.

To add a Custom Validation attribute

  1. 1.
    Add a metadata class for the entity class, as described in How to: Add Metadata Classes.
  2. 2.
    Add a shared code file by using the *.shared.cs or *.shared.vb naming pattern.
    The code file will contain the custom validation object.
  3. 3.
    Add a method that determines whether the data is valid.
    The method must be public and static (or Public and Shared in Visual Basic). It must return a ValidationResult to indicate the result of the validation check. When you define the customized validation class, you must provide at least some code other than auto-implemented properties for the class to be correctly generated in the client project.
    The following example shows a class named ProductValidator with a method named IsProductValid that validates a Product entity. When the data is not valid, you return the error message and the name of the property that failed validation.
    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.")
    Else
    Return ValidationResult.Success
    End If
    End Function
    End Class
    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.");
    }
    else
    {
    return ValidationResult.Success;
    }
    }
    }
  4. 4.
    On the entity or property that you want to validate, add the CustomValidationAttribute attribute and pass the type of the validation object and the name of the method that performs the validation.
    The following example shows the CustomValidationAttribute attribute applied to an entity. The validation object type is ProductValidator and the method is 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(RIAServicesExample.Web.SharedCode.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. 5.
    Build (Ctrl+Shift+B) the solution.
  6. 6.
    In the Silverlight application, open the Generated_Code folder. Notice the shared code file exists in the folder and how the CustomValidationAttribute is applied to the entity.