How to: Validate Data

[WCF RIA Services Version 1 Service Pack 2 is compatible with either .NET framework 4 or .NET Framework 4.5, and with either Silverlight 4 or Silverlight 5.]

This topic describes how you add validation attributes to properties and entities to enforce validation rules. WCF 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 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 RIA Services

  1. Add a metadata class for the entity class, as described in How to: Add Metadata Classes.

  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. Build (Ctrl+Shift+B) the solution.

  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. Add a metadata class for the entity class, as described in How to: Add Metadata Classes.

  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. 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. 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. Build (Ctrl+Shift+B) the solution.

  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.