Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/aspnetwebstack.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'src/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs')
-rw-r--r--src/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs95
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>();
+ }
+ }
+ }
+}