默认情况下,FluentValidation 使用Continue 级联模式在规则定义中调用验证器(即它调用所有验证器)。在第一个验证器失败后,您应该使用StopOnFirstFailure 模式停止执行:
ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;
请注意,这将全局设置StopOnFirstFailure 模式。如果要为特定验证器指定此模式,可以使用验证器类的属性:
public class RequestValidator : AbstractValidator<Request>
{
public RequestValidator()
{
CascadeMode = CascadeMode.StopOnFirstFailure;
RuleFor(req => req.param1)
.NotEmpty().WithMessage("param1 is missing.")
.Must((req, param1) => IsValidRequest(req)).WithMessage("Invalid request.");
RuleFor(req => req.param2).NotEmpty().WithMessage("param2 is missing.");
RuleFor(req => req.param3).NotEmpty().WithMessage("param3 is missing.");
}
}
在上面的示例中,如果NotEmpty 验证器失败,Must 验证器将不会被执行。
如果你只想在三个参数都不为空的情况下执行Must验证器,那么When是最好的选择:
When(req => !String.IsNullOrEmpty(req.param1)
&& !String.IsNullOrEmpty(req.param2)
&& !String.IsNullOrEmpty(req.param3), () => {
RuleFor(req => req.param1)
.Must((req, param1) => IsValidRequest(req)).WithMessage("Invalid request.");
});
您可以将前置条件检查移至单独的方法:
private bool AllParametersSpecified(Request req)
{
return !String.IsNullOrEmpty(req.param1)
&& !String.IsNullOrEmpty(req.param2)
&& !String.IsNullOrEmpty(req.param3);
}
而且条件将更具可读性:
When(AllParametersSpecified, () => {
RuleFor(req => req.param1)
.Must((req, param1) => IsValidRequest(req)).WithMessage("Invalid request.");
});