流畅验证条件规则

3
我们有一个条件要求,只有在开启标志时,才对字段应用非空规则。就像下面的代码一样。
这是正确的方法吗?
public AccountSetupModelValidator(ISessionProvider sessionProvider)
    {
        var regexPatterns = new RegExPatterns();

        RuleFor(x => x.MemorableDate)
            .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_memorabledate);


        RuleFor(x => x.MemorableDateAnswer)
            .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_memorabledateanswer)
            .Matches(regexPatterns.MemorableDateFormat).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_memorabledateinvalidformat)
            .Length(5).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100006_maxlength);

       RuleFor(x => x.SecurityQuestion)
           .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_securityquestion);

        RuleFor(x => x.SecurityAnswer)
            .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_1001_securityanswer) 
            .Length(1, 40).WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100006_maxlength);

        if (sessionProvider.OnboardingApplicationData.ToggleNavigationView.HasProvisionalAccount)
        {

              RuleFor(x => x.TempCardNumber)
                .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
                .Matches(regexPatterns.NumericOnly)
                .WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
                .Length(15).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard);

            RuleFor(x => x.SecurityCode)
                .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
                .Matches(regexPatterns.NumericOnly)
                .WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
                .Length(4).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_securitycode);
        }

    }
1个回答

7
我建议不要尝试依赖于您的sessionProvider,因为这会使独立测试验证器变得更加困难。相反,可以利用FluentValidation的条件When()和Unless()方法。
如果您的属性HasProvisionalAccount在模型类上存在(或可以放置),则可以像这样重写该部分:
// remove the if() statement, and use .When()
RuleFor(x => x.TempCardNumber)
    .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
    .Matches(regexPatterns.NumericOnly)
    .WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
    .Length(15).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
    .When(x => x.HasProvisionalAccount);

RuleFor(x => x.SecurityCode)
    .NotEmpty().WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_tempcard)
    .Matches(regexPatterns.NumericOnly)
    .WithLocalizedMessage(ResourceAreas.Messages.Message_Onboarding_100007_numbersonly)
    .Length(4).WithLocalizedMessage(ResourceAreas.Messages.Message_AccountSetup_100006_securitycode)
    .When(x => x.HasProvisionalAccount);

每条规则仅在 HasProvisionalAccount 为 true 时执行。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接