ASP.NET WEB API - 如果属性级别验证失败,则永远不会调用类级别的验证属性

时间:2012-12-21 12:22:17

标签: asp.net-web-api

在MVC中,如果属性级别验证失败,则永远不会调用类级别属性的验证。

如何解决这个问题?我想要属性和验证级别的错误列表。

1 个答案:

答案 0 :(得分: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