0

MVC では、プロパティ レベルの検証が失敗した場合、クラス レベルの属性の検証は呼び出されません。

この問題を解決するには?プロパティ レベルと検証レベルの両方のエラー リストが必要です。

4

1 に答える 1

1

Web API や MVC フレームワークの既存のアーキテクチャで実現できるとは思えません。

クラス バリデーターは、すべてのプロパティ バリデーターがパスした後にのみ実行され、この動作はプライベートCompositeModelValidatorクラスでロックされます。

ここを参照してください(Web APIの場合、MVCの場合、クラスはほぼ同じです):

private class CompositeModelValidator : ModelValidator
        {
            public CompositeModelValidator(IEnumerable<ModelValidatorProvider> validatorProviders)
                : base(validatorProviders)
            {
            }

            public override IEnumerable<ModelValidationResult> Validate(ModelMetadata metadata, object container)
            {
                bool propertiesValid = true;

                foreach (ModelMetadata propertyMetadata in metadata.Properties)
                {
                    foreach (ModelValidator propertyValidator in propertyMetadata.GetValidators(ValidatorProviders))
                    {
                        foreach (ModelValidationResult propertyResult in propertyValidator.Validate(metadata, container))
                        {
                            propertiesValid = false;
                            yield return new ModelValidationResult
                            {
                                MemberName = ModelBindingHelper.CreatePropertyModelName(propertyMetadata.PropertyName, propertyResult.MemberName),
                                Message = propertyResult.Message
                            };
                        }
                    }
                }

                if (propertiesValid) //<---- HERE
                {
                    foreach (ModelValidator typeValidator in metadata.GetValidators(ValidatorProviders))
                    {
                        foreach (ModelValidationResult typeResult in typeValidator.Validate(metadata, container))
                        {
                            yield return typeResult;
                        }
                    }
                }
            }
        }

https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Http/Validation/ModelValidator.cs

于 2012-12-21T13:31:52.307 に答える