use*_*405 3 c# asp.net-mvc fluent fluentvalidation
我们有一个条件要求,即只有在打开标志时才应将空规则应用于字段.类似下面的代码.
这是正确的方法吗?
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);
}
}
Run Code Online (Sandbox Code Playgroud)
我建议不要尝试依赖你的sessionProvider,因为这会让你更难独立地测试你的验证器.
相反,请使用FluentValidation的条件When()和Until()方法.
如果您的属性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);
Run Code Online (Sandbox Code Playgroud)
每个规则仅在HasProvisionalAccount为true时执行.
| 归档时间: |
|
| 查看次数: |
7955 次 |
| 最近记录: |