Merge pull request #249 from pcc/xgetinputfocus
[mono.git] / mcs / class / System.Web.Mvc3 / Mvc / DataAnnotationsModelValidator.cs
1 namespace System.Web.Mvc {
2     using System;
3     using System.Collections.Generic;
4     using System.ComponentModel.DataAnnotations;
5     using System.Linq;
6
7     public class DataAnnotationsModelValidator : ModelValidator {
8         public DataAnnotationsModelValidator(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute)
9             : base(metadata, context) {
10
11             if (attribute == null) {
12                 throw new ArgumentNullException("attribute");
13             }
14
15             Attribute = attribute;
16         }
17
18         protected internal ValidationAttribute Attribute { get; private set; }
19
20         protected internal string ErrorMessage {
21             get {
22                 return Attribute.FormatErrorMessage(Metadata.GetDisplayName());
23             }
24         }
25
26         public override bool IsRequired {
27             get {
28                 return Attribute is RequiredAttribute;
29             }
30         }
31
32         internal static ModelValidator Create(ModelMetadata metadata, ControllerContext context, ValidationAttribute attribute) {
33             return new DataAnnotationsModelValidator(metadata, context, attribute);
34         }
35
36         public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
37             IEnumerable<ModelClientValidationRule> results = base.GetClientValidationRules();
38
39             IClientValidatable clientValidatable = Attribute as IClientValidatable;
40             if (clientValidatable != null) {
41                 results = results.Concat(clientValidatable.GetClientValidationRules(Metadata, ControllerContext));
42             }
43
44             return results;
45         }
46
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();
52
53             ValidationResult result = Attribute.GetValidationResult(Metadata.Model, context);
54             if (result != ValidationResult.Success) {
55                 yield return new ModelValidationResult {
56                     Message = result.ErrorMessage
57                 };
58             }
59         }
60     }
61 }