1 /* ****************************************************************************
\r
3 * Copyright (c) Microsoft Corporation. All rights reserved.
\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
9 * You must not remove this notice, or any other, from this software.
\r
11 * ***************************************************************************/
\r
13 namespace System.Web.Mvc {
\r
15 using System.Collections.Generic;
\r
16 using System.Diagnostics.CodeAnalysis;
\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
24 if (controllerContext == null) {
\r
25 throw new ArgumentNullException("controllerContext");
\r
28 Metadata = metadata;
\r
29 ControllerContext = controllerContext;
\r
32 protected internal ControllerContext ControllerContext { get; private set; }
\r
34 public virtual bool IsRequired {
\r
40 protected internal ModelMetadata Metadata { get; private set; }
\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
47 public static ModelValidator GetModelValidator(ModelMetadata metadata, ControllerContext context) {
\r
48 return new CompositeModelValidator(metadata, context);
\r
51 public abstract IEnumerable<ModelValidationResult> Validate(object container);
\r
53 private class CompositeModelValidator : ModelValidator {
\r
54 public CompositeModelValidator(ModelMetadata metadata, ControllerContext controllerContext)
\r
55 : base(metadata, controllerContext) {
\r
58 public override IEnumerable<ModelValidationResult> Validate(object container) {
\r
59 bool propertiesValid = true;
\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
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