2

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 所建议的,我采取的方法是单独验证列表中的每个对象。

4

1 回答 1

2

将@Fals 的评论标记为答案,因为这是我最终采用的方法。因为没有其他问题可以满足我原来的问题。

@Fals - 这就是问题所在,您必须将对象逐个传递给验证!

于 2013-06-28T22:39:47.207 回答