カスタム検証属性で呼び出すValidator.TryValidateObject
とvalidateAllProperties = true
、トリガーされません。には、誤ったプロパティ値のValidationResult
エントリが含まれていません。以下は、これをテストするために使用されたモデル、属性、およびコードです。
//Model
public class Model
{
[AmountGreaterThanZero]
public int? Amount { get; set; }
}
//Attribute
public sealed class AmountGreaterThanZero: ValidationAttribute
{
private const string errorMessage = "Amount should be greater than zero.";
public AmountGreaterThanZero() : base(errorMessage) { }
public override string FormatErrorMessage(string name)
{
return errorMessage;
}
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
if (value != null)
{
if ((int)value <= 0)
{
var message = FormatErrorMessage(validationContext.DisplayName);
return new ValidationResult(message);
}
}
return null;
}
public override bool IsValid(object value)
{
if ((int)value < 0)
{
return false;
}
return true;
}
}
//Validation Code
var container = new Container();
container.ModelList = new List<Model>() { new Model() { Amount = -5 } };
var validationContext = new ValidationContext(container, null, null);
var validationResults = new List<ValidationResult>();
var modelIsValid = Validator.TryValidateObject(container, validationContext, validationResults, true);
注:メソッドを使用すると、検証が正常に機能ValidationResult
し、正しいエラーメッセージが返されますTryValidateProperty
。
編集: @Fals によって提案されたように、私が取ったアプローチは、リスト内の各オブジェクトを個別に検証することでした。