1 namespace System.Web.Mvc {
3 using System.Collections.Generic;
4 using System.ComponentModel.DataAnnotations;
7 public class DataAnnotationsModelValidator : ModelValidator {
8 public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute)
9 : base(metadata, context) {
11 if (attribute == null) {
12 throw new ArgumentNullException("attribute");
15 Attribute = attribute;
18 protected internal ValidationAttribute Attribute { get; private set; }
20 protected internal string ErrorMessage {
22 return Attribute.FormatErrorMessage(Metadata.GetDisplayName());
26 public override bool IsRequired {
28 return Attribute is RequiredAttribute;
32 internal static ModelValidator Create(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute) {
33 return new DataAnnotationsModelValidator(metadata, context, attribute);
36 public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
37 IEnumerable<ModelClientValidationRule> results = base.GetClientValidationRules();
39 IClientValidatable clientValidatable = Attribute as IClientValidatable;
40 if (clientValidatable != null) {
41 results = results.Concat(clientValidatable.GetClientValidationRules(Metadata, ControllerContext));
47 public override IEnumerable<ModelValidationResult> Validate(object container) {
48 // Per the WCF RIA Services team, instance can never be null (if you have
49 // no parent, you pass yourself for the "instance" parameter).
50 ValidationContext context = new ValidationContext(container ?? Metadata.Model, null, null);
51 context.DisplayName = Metadata.GetDisplayName();
53 ValidationResult result = Attribute.GetValidationResult(Metadata.Model, context);
54 if (result != ValidationResult.Success) {
55 yield return new ModelValidationResult {
56 Message = result.ErrorMessage