在 MVC 中,如果属性级别验证失败,则永远不会调用类级别属性的验证。
如何解决这个问题呢?我想要属性和验证级别的错误列表。
我不相信它可以用现有的 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;
}
}
}
}
}