【问题标题】:check another rule with fluentvalidation用 fluentvalidation 检查另一个规则
【发布时间】:2015-08-27 21:08:02
【问题描述】:

我有以下代码来验证实体:

   public class AffiliateValidator : AbstractValidator<Affiliate>
   {
    public AffiliateValidator ()
    {
        RuleFor(x => x.IBAN).SetValidator(new ValidIBAN()).Unless( x => String.IsNullOrWhiteSpace(x.IBAN));
     }
    }

还有 ValidIBAN() 代码:

public class ValidIBAN  : PropertyValidator
{
    public ValidIBAN()
        :base("IBAN \"{PropertyValue}\" not valid.")
    {

    }

    protected override bool IsValid(PropertyValidatorContext context)
    {
        var iban = context.PropertyValue as string;
        IBAN.IBANResult result = IBAN.CheckIban(iban, false);
        return result.Validation == (IBAN.ValidationResult.IsValid);
    }

}

}

所以,IBAN 类的 CheckIBAN 方法完成了这项肮脏的工作。

现在,我需要对另一个属性应用以下规则: 如果 DirectDebit (bool) 为真,则 IBAN 不能为空且必须有效。

我可以这样做:

RuleFor(x => x.DirectDebit).Equal(false).When(a => string.IsNullOrEmpty(a.IBAN)).WithMessage("TheMessage.");

但是我如何调用另一个规则,在这种情况下是 IBAN 的规则,以检查是否有效?

【问题讨论】:

  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • @JohnSaunders:对不起。我不确定发布的标题是什么。不过下次会记住的。
  • "C# fluentvalidation 检查另一个规则"

标签: c# .net validation fluentvalidation


【解决方案1】:

问题往往比看起来简单。这是我为应用 DirectDebit 字段规则而采用的解决方案。

    RuleFor(x => x.DirectDebit).Must(HaveValidAccounts).When(x => x.DirectDebit)
            .WithMessage("TheMessage");

同时更改 IBAN 的规则:

 RuleFor(x => x.IBAN).Must(IsValidIBAN)
                            .Unless(x => String.IsNullOrWhiteSpace(x.IBAN))
                            .WithMessage("The IBAN \"{PropertyValue}\" is not valid.");

...然后:

   private bool HaveValidAccounts(ViewModel instance,   bool DirectDebit)
    {
        if (!DirectDebit)
        { return true; }

        bool CCCResult = IsValidCCC(instance.CCC);
        bool IBANResult = IsValidIBAN(instance.IBAN);

        return CCCResult || IBANResult;
    }

     private bool IsValidIBAN(string iban)
    {
        return CommonInfrastructure.Finantial.IBAN.CheckIban(iban, false).Validation == IBAN.ValidationResult.IsValid;
    }

诀窍是使用 Must() 的实例参数来做任何我想做的事情。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2013-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多