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