2017-04-26 60 views
2

如果其中一個驗證規則集失敗,是否有任何方法可跳過執行規則集中的驗證規則。跳過在Fluent驗證規則集中執行其他驗證規則(如果其中一個驗證規則失敗)

我有我的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)這個下面的規則我不得不再次驗證參數1,參數2,參數3做之前存在我自定義驗證,即使上述規則失敗,所有其他驗證仍將繼續嘗試。

+0

我發現這個http://stackoverflow.com/questions/21605534/stop-fluent-validation-on-first-failure – anveshtummala

回答

4

默認情況下,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."); 
}); 
+0

如果我的函數IsValidRequest需要所有param1,param2,param3不爲null,謝謝。快速回復謝爾蓋。 – anveshtummala

+0

這很好,但我仍然有一個問題。在調用我的IsValidRequest函數之前,我無法給用戶提供param1的單個消息或缺少param2。現在我僅限於爲「無效請求」提供錯誤消息。 – anveshtummala

+0

@anveshtummala只是不刪除params的驗證規則。他們會做驗證。如果指定了所有參數,則IsValidRequest驗證將運行 –