/web/mcs/class/System.Web.Mvc2/System.Web.Mvc/DataErrorInfoModelValidatorProvider.cs
C# | 87 lines | 62 code | 10 blank | 15 comment | 13 complexity | 3e7efe8665be95315e961a10718e74d8 MD5 | raw file
Possible License(s): LGPL-2.0, MPL-2.0-no-copyleft-exception, CC-BY-SA-3.0, GPL-2.0, LGPL-2.1
- /* ****************************************************************************
- *
- * Copyright (c) Microsoft Corporation. All rights reserved.
- *
- * This software is subject to the Microsoft Public License (Ms-PL).
- * A copy of the license can be found in the license.htm file included
- * in this distribution.
- *
- * You must not remove this notice, or any other, from this software.
- *
- * ***************************************************************************/
- namespace System.Web.Mvc {
- using System;
- using System.Collections.Generic;
- using System.ComponentModel;
- using System.Linq;
- 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>();
- }
- }
- }
- }