2

カスタム検証属性で呼び出すValidator.TryValidateObjectvalidateAllProperties = 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 によって提案されたように、私が取ったアプローチは、リスト内の各オブジェクトを個別に検証することでした。

4

1 に答える 1