我使用fluentvalidator非常新。我所知道的只是基本rulefor()
但是当涉及到习惯时我完全无能为力。任何人都可以指导我吗?
我需要验证一个可以为空的bool属性。我需要比较5个bool属性,其中至少有一个被选中,然后它应该返回true,否则,它应该返回false并提示一条错误消息,其中至少选择了其中一个。 以下是我的想法,但没有工作。
public class NullableValidator : AbstractValidator<bool>
{
public bool isQualificationSet(tblNeutralFileMaint neutral)
{
if (neutral.MediationCivil==false && !neutral.CaseEvalCondemnation==false && neutral.MediationMagistrate==false && neutral.CaseEvalTorts==false && neutral.CaseEvalDomesticViolence==false)
return false;
else return true;
}
}
我用这个就是这样的:
RuleFor(n => n.IsQualificationSet).SetValidator(new NullableValidator());
谁能告诉我怎么样?现在已经工作了几个小时了。它没有显示任何错误但不起作用或转到方法。
答案 0 :(得分:4)
我不完全确定我明白你要做什么。您是否希望仅在IsQualificationSet属性设置为true时才执行此规则?我不理解IsQualificationSet和其他属性之间的关系。
无论如何,如果你想构建一个自定义属性验证器,那么它需要从PropertyValidator基类继承(AbstractValidator用于验证顶级对象)。有关此文件的文件on the FV wiki)。
所以自定义属性验证器看起来像这样:
public class QualificationSetValidator : PropertyValidator {
// Default error message specified in the base ctor
// but it can be overriden using WithMessage in the RuleFor call
public QualificationSetValidator() : base("At least one property must be selected.") {
}
protected override bool IsValid(PropertyValidatorContext context) {
// You can retrieve a reference to the object being validated
// through the context.Instance property
tblNeutralFileMaint neutral = (tblNeutralFileMaint)context.Instance;
// You can also retrieve a reference to the property being validated
// ...using context.PropertyValue
// here is where you can do the custom validation
// and return true/false depending on success.
}
}
作为定义自定义属性验证器类的替代方法,您还可以使用PredicateValidator('Must'方法)在线定义自定义规则 - 如果自定义逻辑很简单,这是一种更好的方法。有details on this in the documentation too。
答案 1 :(得分:2)
让我根据杰里米的回答发表我的工作答案。
public class NeutralFileValidator : AbstractValidator<tblNeutralFileMaint>
{
public NeutralFileValidator()
{
RuleFor(neutral => neutral.NeutralID).NotNull();
RuleFor(neutral => neutral.FirstName).NotNull().NotEmpty();
RuleFor(neutral => neutral.IsQualificationSet).SetValidator(new QualificationSetValidator<tblNeutralFileMaint>());
}
}
public class QualificationSetValidator<T> : PropertyValidator
{
public QualificationSetValidator()
: base("Please check at least One Qualification type.")
{
}
protected override bool IsValid(PropertyValidatorContext context)
{
tblNeutralFileMaint neutral = (tblNeutralFileMaint)context.Instance;
if (neutral.MediationCivil.HasValue && neutral.MediationCivil.Value == false && neutral.MediationDomestic.HasValue && neutral.MediationDomestic.Value == false
&& neutral.MediationDomesticViolence.HasValue && neutral.MediationDomesticViolence.Value == false && neutral.MediationMagistrate.HasValue && neutral.MediationMagistrate.Value == false
&& neutral.CaseEvalContracts.HasValue && neutral.CaseEvalContracts.Value == false && neutral.CaseEvalCondemnation.HasValue && neutral.CaseEvalCondemnation.Value == false
&& neutral.CaseEvalTaxAppeal.HasValue && neutral.CaseEvalTaxAppeal.Value == false && neutral.CaseEvalEquity.HasValue && neutral.CaseEvalEquity.Value == false
&& neutral.CaseEvalTorts.HasValue && neutral.CaseEvalTorts.Value == false && neutral.CaseEvalZoning.HasValue && neutral.CaseEvalZoning.Value == false
&& neutral.CaseEvalDomestic.HasValue && neutral.CaseEvalDomestic.Value == false && neutral.CaseEvalDomesticViolence.HasValue && neutral.CaseEvalDomesticViolence.Value == false)
return false;
else return true;
}
}
答案 2 :(得分:0)
我建议选择
之类的东西RuleFor(r => r).Must(CustomPredicate).WithName("request");
并且
private bool CustomPredicate(Request neutral)
{
if (neutral.MediationCivil==false && !neutral.CaseEvalCondemnation==false && neutral.MediationMagistrate==false && neutral.CaseEvalTorts==false && neutral.CaseEvalDomesticViolence==false)
return false;
else return true;
}
我在这里写了一个更详细的例子 - http://nodogmablog.bryanhogan.net/2015/04/complex-model-validation-using-fluent-validation/