Files
linux-packaging-mono/external/aspnetwebstack/src/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs
Jo Shields a575963da9 Imported Upstream version 3.6.0
Former-commit-id: da6be194a6b1221998fc28233f2503bd61dd9d14
2014-08-13 10:39:27 +01:00

98 lines
3.8 KiB
C#

// Copyright (c) Microsoft Corporation. All rights reserved. See License.txt in the project root for license information.
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>();
}
}
}
}