diff options
Diffstat (limited to 'src/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs')
-rw-r--r-- | src/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/src/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs b/src/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs new file mode 100644 index 00000000..cdfc72dc --- /dev/null +++ b/src/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs @@ -0,0 +1,95 @@ +using System.Collections.Generic; +using System.ComponentModel; +using System.Linq; + +namespace System.Web.Mvc +{ + public class DataErrorInfoModelValidatorProvider : ModelValidatorProvider + { + public override IEnumerable<ModelValidator> GetValidators(ModelMetadata metadata, ControllerContext context) + { + if (metadata == null) + { + throw new ArgumentNullException("metadata"); + } + if (context == null) + { + throw new ArgumentNullException("context"); + } + + return GetValidatorsImpl(metadata, context); + } + + private static IEnumerable<ModelValidator> GetValidatorsImpl(ModelMetadata metadata, ControllerContext context) + { + // If the metadata describes a model that implements IDataErrorInfo, we should call its + // Error property at the appropriate time. + if (TypeImplementsIDataErrorInfo(metadata.ModelType)) + { + yield return new DataErrorInfoClassModelValidator(metadata, context); + } + + // If the metadata describes a property of a container that implements IDataErrorInfo, + // we should call its Item indexer at the appropriate time. + if (TypeImplementsIDataErrorInfo(metadata.ContainerType)) + { + yield return new DataErrorInfoPropertyModelValidator(metadata, context); + } + } + + private static bool TypeImplementsIDataErrorInfo(Type type) + { + return typeof(IDataErrorInfo).IsAssignableFrom(type); + } + + internal sealed class DataErrorInfoClassModelValidator : ModelValidator + { + public DataErrorInfoClassModelValidator(ModelMetadata metadata, ControllerContext controllerContext) + : base(metadata, controllerContext) + { + } + + public override IEnumerable<ModelValidationResult> Validate(object container) + { + IDataErrorInfo castModel = Metadata.Model as IDataErrorInfo; + if (castModel != null) + { + string errorMessage = castModel.Error; + if (!String.IsNullOrEmpty(errorMessage)) + { + return new ModelValidationResult[] + { + new ModelValidationResult() { Message = errorMessage } + }; + } + } + return Enumerable.Empty<ModelValidationResult>(); + } + } + + internal sealed class DataErrorInfoPropertyModelValidator : ModelValidator + { + public DataErrorInfoPropertyModelValidator(ModelMetadata metadata, ControllerContext controllerContext) + : base(metadata, controllerContext) + { + } + + public override IEnumerable<ModelValidationResult> Validate(object container) + { + IDataErrorInfo castContainer = container as IDataErrorInfo; + if (castContainer != null && !String.Equals(Metadata.PropertyName, "error", StringComparison.OrdinalIgnoreCase)) + { + string errorMessage = castContainer[Metadata.PropertyName]; + if (!String.IsNullOrEmpty(errorMessage)) + { + return new ModelValidationResult[] + { + new ModelValidationResult() { Message = errorMessage } + }; + } + } + return Enumerable.Empty<ModelValidationResult>(); + } + } + } +} |