我正在使用FluentValidation
和IDataErrorInfo
,我的验证器定义如下:
public class StsInfoValidator : AbstractValidator<StsInfo>
{
public StsInfoValidator()
{
RuleFor(x => x.SomeProperty).Cascade(CascadeMode.StopOnFirstFailure)
.NotNull().NotEmpty().WithMessage("SomeProperty is required.");
}
}
但是,传入null
属性似乎不会触发验证器:
#region IDataErrorInfo
public string this[string columnName]
{
get
{
var validator = new StsInfoValidator();
if (columnName.Equals("SomeProperty"))
{
// SomeProperty below is null
if (validator.Validate(this, SomeProperty).Errors.Any())
return validator.Validate(this, CampusNexusApiServer).Errors.FirstOrDefault().ErrorMessage;
else
{
validator = null;
return string.Empty;
}
}
return string.Empty;
}
}
#endregion
答案 0 :(得分:2)
您遇到的问题是,如果您选择使用需要lambda表达式的Validate
重载来评估您的属性,那么您必须这样做:
而不是:
validator.Validate(this, SomeProperty);
你需要:
validator.Validate(this, s => s.SomeProperty);
这里有这个重载文档:
或者,您可以使用其他Validate
重载并将您的属性名称作为字符串传递:
validator.Validate(this, columnName);
或
validator.Validate(this, "SomeProperty");
以下是Validate的属性Name(s)重载:
public string this[string columnName]
{
get
{
var validator = new StsInfoValidator();
if (columnName.Equals("SomeProperty"))
{
// SomeProperty below is null
//option 1
var result = validator.Validate(this,s => s.SomeProperty);
//option 2
//var result = validator.Validate(this, columnName);
//option 3
//var result = validator.Validate(this, "SomeProperty");
if (result.Errors.Any())
return validator.Validate(this, CampusNexusApiServer).Errors.FirstOrDefault().ErrorMessage;
else
{
validator = null;
return string.Empty;
}
}
return string.Empty;
}
}