如果其中一个验证规则失败,则跳过执行 Fluent 验证规则集中的其他验证规则
Skip Executing other Validation Rules in the Fluent validation Ruleset, if one of them fails
如果其中一个验证规则失败,是否有任何方法可以跳过执行规则集中的验证规则。
我的 API 端点有以下规则
参数 1、参数 2、参数 3
RuleSet =>
RuleFor(req => req.param1).NotEmpty().WithMessage("param1 is missing.");
RuleFor(req => req.param2).NotEmpty().WithMessage("param2 is missing.");
RuleFor(req => req.param3).NotEmpty().WithMessage("param3 is missing.");
RuleFor(req => req.param1).Must((req, param1) => IsValidRequest(req)).WithMessage("Invalid request.");
在我的 IsValidRequest(req) 中,我必须在执行自定义验证之前再次验证 param1、param2、param3 是否存在,因为即使上述规则失败,所有其他验证仍将继续尝试。
默认情况下,FluentValidation 使用 Continue
级联模式在规则定义中调用验证器(即调用所有验证器)。您应该使用 StopOnFirstFailure
模式在第一个验证器失败后停止执行:
ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;
请注意,这将全局设置 StopOnFirstFailure
模式。如果要为特定验证器指定此模式,可以使用 属性 of validator class:
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.");
});
如果其中一个验证规则失败,是否有任何方法可以跳过执行规则集中的验证规则。
我的 API 端点有以下规则
参数 1、参数 2、参数 3
RuleSet =>
RuleFor(req => req.param1).NotEmpty().WithMessage("param1 is missing.");
RuleFor(req => req.param2).NotEmpty().WithMessage("param2 is missing.");
RuleFor(req => req.param3).NotEmpty().WithMessage("param3 is missing.");
RuleFor(req => req.param1).Must((req, param1) => IsValidRequest(req)).WithMessage("Invalid request.");
在我的 IsValidRequest(req) 中,我必须在执行自定义验证之前再次验证 param1、param2、param3 是否存在,因为即使上述规则失败,所有其他验证仍将继续尝试。
默认情况下,FluentValidation 使用 Continue
级联模式在规则定义中调用验证器(即调用所有验证器)。您应该使用 StopOnFirstFailure
模式在第一个验证器失败后停止执行:
ValidatorOptions.CascadeMode = CascadeMode.StopOnFirstFailure;
请注意,这将全局设置 StopOnFirstFailure
模式。如果要为特定验证器指定此模式,可以使用 属性 of validator class:
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.");
});