[英]check another rule with fluentvalidation
我有以下代码来验证实体:
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 的规则,以检查是否有效?
问题往往比看起来更简单。 这是我为 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() 的实例参数来做我想做的任何事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.