自定义fluentvalidator

时间:2011-07-15 11:56:40

标签: c# fluentvalidation

我使用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());
谁能告诉我怎么样?现在已经工作了几个小时了。它没有显示任何错误但不起作用或转到方法。

3 个答案:

答案 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/