1 namespace System.Web.ModelBinding {
3 using System.Collections.Generic;
4 using System.ComponentModel.DataAnnotations;
6 public class DataAnnotationsModelValidator : ModelValidator {
7 public DataAnnotationsModelValidator(ModelMetadata metadata, ModelBindingExecutionContext context, ValidationAttribute attribute)
8 : base(metadata, context) {
10 if (attribute == null) {
11 throw new ArgumentNullException("attribute");
14 Attribute = attribute;
17 protected internal ValidationAttribute Attribute { get; private set; }
19 protected internal string ErrorMessage {
21 return Attribute.FormatErrorMessage(Metadata.GetDisplayName());
25 public override bool IsRequired {
27 return Attribute is RequiredAttribute;
31 internal static ModelValidator Create(ModelMetadata metadata, ModelBindingExecutionContext context, ValidationAttribute attribute) {
32 return new DataAnnotationsModelValidator(metadata, context, attribute);
35 //Client Validation is different for Web Forms. This will probably need to be enabled when MVC merges with Webforms model binding.
37 public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
38 IEnumerable<ModelClientValidationRule> results = base.GetClientValidationRules();
40 IClientValidatable clientValidatable = Attribute as IClientValidatable;
41 if (clientValidatable != null) {
42 results = results.Concat(clientValidatable.GetClientValidationRules(Metadata, ModelBindingExecutionContext));
49 public override IEnumerable<ModelValidationResult> Validate(object container) {
50 // Per the WCF RIA Services team, instance can never be null (if you have
51 // no parent, you pass yourself for the "instance" parameter).
52 ValidationContext context = new ValidationContext(container ?? Metadata.Model, null, null);
53 context.DisplayName = Metadata.GetDisplayName();
55 ValidationResult result = Attribute.GetValidationResult(Metadata.Model, context);
56 if (result != ValidationResult.Success) {
57 yield return new ModelValidationResult {
58 Message = result.ErrorMessage