New tests.
[mono.git] / mcs / class / System.Web.Mvc2 / System.Web.Mvc / ModelValidator.cs
1 /* ****************************************************************************\r
2  *\r
3  * Copyright (c) Microsoft Corporation. All rights reserved.\r
4  *\r
5  * This software is subject to the Microsoft Public License (Ms-PL). \r
6  * A copy of the license can be found in the license.htm file included \r
7  * in this distribution.\r
8  *\r
9  * You must not remove this notice, or any other, from this software.\r
10  *\r
11  * ***************************************************************************/\r
12 \r
13 namespace System.Web.Mvc {\r
14     using System;\r
15     using System.Collections.Generic;\r
16     using System.Diagnostics.CodeAnalysis;\r
17     using System.Linq;\r
18 \r
19     public abstract class ModelValidator {\r
20         protected ModelValidator(ModelMetadata metadata, ControllerContext controllerContext) {\r
21             if (metadata == null) {\r
22                 throw new ArgumentNullException("metadata");\r
23             }\r
24             if (controllerContext == null) {\r
25                 throw new ArgumentNullException("controllerContext");\r
26             }\r
27 \r
28             Metadata = metadata;\r
29             ControllerContext = controllerContext;\r
30         }\r
31 \r
32         protected internal ControllerContext ControllerContext { get; private set; }\r
33 \r
34         public virtual bool IsRequired {\r
35             get {\r
36                 return false;\r
37             }\r
38         }\r
39 \r
40         protected internal ModelMetadata Metadata { get; private set; }\r
41 \r
42         [SuppressMessage("Microsoft.Design", "CA1024:UsePropertiesWhereAppropriate", Justification = "This method may perform non-trivial work.")]\r
43         public virtual IEnumerable<ModelClientValidationRule> GetClientValidationRules() {\r
44             return Enumerable.Empty<ModelClientValidationRule>();\r
45         }\r
46 \r
47         public static ModelValidator GetModelValidator(ModelMetadata metadata, ControllerContext context) {\r
48             return new CompositeModelValidator(metadata, context);\r
49         }\r
50 \r
51         public abstract IEnumerable<ModelValidationResult> Validate(object container);\r
52 \r
53         private class CompositeModelValidator : ModelValidator {\r
54             public CompositeModelValidator(ModelMetadata metadata, ControllerContext controllerContext)\r
55                 : base(metadata, controllerContext) {\r
56             }\r
57 \r
58             public override IEnumerable<ModelValidationResult> Validate(object container) {\r
59                 bool propertiesValid = true;\r
60 \r
61                 foreach (ModelMetadata propertyMetadata in Metadata.Properties) {\r
62                     foreach (ModelValidator propertyValidator in propertyMetadata.GetValidators(ControllerContext)) {\r
63                         foreach (ModelValidationResult propertyResult in propertyValidator.Validate(Metadata.Model)) {\r
64                             propertiesValid = false;\r
65                             yield return new ModelValidationResult {\r
66                                 MemberName = DefaultModelBinder.CreateSubPropertyName(propertyMetadata.PropertyName, propertyResult.MemberName),\r
67                                 Message = propertyResult.Message\r
68                             };\r
69                         }\r
70                     }\r
71                 }\r
72 \r
73                 if (propertiesValid) {\r
74                     foreach (ModelValidator typeValidator in Metadata.GetValidators(ControllerContext)) {\r
75                         foreach (ModelValidationResult typeResult in typeValidator.Validate(container)) {\r
76                             yield return typeResult;\r
77                         }\r
78                     }\r
79                 }\r
80             }\r
81         }\r
82     }\r
83 }\r