2

我对使用 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());

谁能告诉我怎么做?现在已经为此工作了几个小时。它没有显示任何错误,但不起作用或转到该方法。

4

3 回答 3

4

我不完全确定我理解你想要做什么。您是否希望仅当 IsQualificationSet 属性设置为 true 时才执行此规则?我不明白 IsQualificationSet 和其他属性之间的关系。


无论如何,如果您想构建自定义属性验证器,那么它需要从 PropertyValidator 基类继承(AbstractValidator 用于验证顶级对象)。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(“必须”方法)在线定义自定义规则 - 如果自定义逻辑很简单,这是一种更好的方法。文档中也有这方面的详细信息。

于 2011-07-16T11:08:47.763 回答
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;


    }
}
于 2011-07-18T08:17:49.453 回答
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/

于 2015-04-13T04:34:44.230 回答