Reputation: 1471
We have a conditional requirement that not empty rule should be applied to a field only when there is a flag turned on. Something like the code below.
Is this a correct approach?
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);
}
}
Upvotes: 3
Views: 11583
Reputation: 2579
I would recommend not trying to take a dependency on your sessionProvider, since that makes it much harder to test your validators independently.
Instead, make use of FluentValidation's conditional When() and Unless() methods.
If your property HasProvisionalAccount is (or can be put) on the model class, you could rewrite the section like this:
// 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);
Each rule will only execute when HasProvisionalAccount is true.
Upvotes: 7