[coop] Temporarily restore MonoThreadInfo when TLS destructor runs. Fixes #43099
[mono.git] / mcs / class / referencesource / System.Web / ModelBinding / DataAnnotationsModelValidator.cs
1 namespace System.Web.ModelBinding {
2     using System;
3     using System.Collections.Generic;
4     using System.ComponentModel.DataAnnotations;
5
6     public class DataAnnotationsModelValidator : ModelValidator {
7         public DataAnnotationsModelValidator(ModelMetadata metadata, ModelBindingExecutionContext context, ValidationAttribute attribute)
8             : base(metadata, context) {
9
10             if (attribute == null) {
11                 throw new ArgumentNullException("attribute");
12             }
13
14             Attribute = attribute;
15         }
16
17         protected internal ValidationAttribute Attribute { get; private set; }
18
19         protected internal string ErrorMessage {
20             get {
21                 return Attribute.FormatErrorMessage(Metadata.GetDisplayName());
22             }
23         }
24
25         public override bool IsRequired {
26             get {
27                 return Attribute is RequiredAttribute;
28             }
29         }
30
31         internal static ModelValidator Create(ModelMetadata metadata, ModelBindingExecutionContext context, ValidationAttribute attribute) {
32             return new DataAnnotationsModelValidator(metadata, context, attribute);
33         }
34
35         //Client Validation is different for Web Forms. This will probably need to be enabled when MVC merges with Webforms model binding.
36 #if UNDEF
37         public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() {
38             IEnumerable<ModelClientValidationRule> results = base.GetClientValidationRules();
39
40             IClientValidatable clientValidatable = Attribute as IClientValidatable;
41             if (clientValidatable != null) {
42                 results = results.Concat(clientValidatable.GetClientValidationRules(Metadata, ModelBindingExecutionContext));
43             }
44
45             return results;
46         }
47 #endif
48
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();
54
55             ValidationResult result = Attribute.GetValidationResult(Metadata.Model, context);
56             if (result != ValidationResult.Success) {
57                 yield return new ModelValidationResult {
58                     Message = result.ErrorMessage
59                 };
60             }
61         }
62     }
63 }