默認情況下,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.");
}
}
在上面的例子中Must
驗證,如果驗證NotEmpty
失敗將不會被執行。
如果要執行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.");
});
我發現這個http://stackoverflow.com/questions/21605534/stop-fluent-validation-on-first-failure – anveshtummala