MVC では、プロパティ レベルの検証が失敗した場合、クラス レベルの属性の検証は呼び出されません。
この問題を解決するには?プロパティ レベルと検証レベルの両方のエラー リストが必要です。
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;
}
}
}
}
}