【问题标题】:custom fluentvalidator自定义流利验证器
【发布时间】:2015-04-13 12:34:44
【问题描述】:

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

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

【问题讨论】:

    标签: c# fluentvalidation


    【解决方案1】:

    我不完全确定我理解你想要做什么。您是否希望仅当 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(“必须”方法)在线定义自定义规则 - 如果自定义逻辑很简单,这是一种更好的方法。有details on this in the documentation too

    【讨论】:

    • 非常感谢这解决了我的问题。 PropertyValidatorContext 上下文是我正在寻找的上下文。 :)
    【解决方案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;
    
    
        }
    }
    

    【讨论】:

      【解决方案3】:

      我建议使用类似的东西

      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/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-26
        • 1970-01-01
        • 1970-01-01
        • 2018-09-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多