使用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所建议的那样,我采用的方法是单独验证列表中的每个对象。
答案 0 :(得分:2)
将@Fals的评论标记为答案,因为这是我最终采用的方法。因为没有其他问题得到满足我原来的问题。
@Fals - 多数问题,您必须逐个对象传递给验证!