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