2011-09-15 40 views
5

我在驗證下面的代碼:FluentValidation通參數WithMessage

RuleFor(mb => mb.Amount). 
Must((mb, amount) => 
       { 
        var betLimit = _battlesService.GetBetLimit(mb.BattleId); 

        mb.Amount <= betLimit; 
       }). 
WithMessage("Bet should be less than {0}", "bet limit value should be placed here"); 

有什麼辦法來betLimit值傳遞給WithMessage方法?我看到的唯一解決方案是將betLimit值設置爲ViewModel的某些屬性,然後使用funcs在WithMessage重載中訪問它。但它很醜。

回答

4

既然Amount不是用來得到betLimit,那麼當驗證器啓動時不能將下注限制放入字段中,並在任何你想要的地方使用它?喜歡的東西:

public ViewModelValidator(IBattlesService battlesService) 
{ 
    var betLimit = battlesService.GetBetLimit(); 

    RuleFor(mb => mb.Amount). 
    Must((mb, amount) => 
        { 
         mb.Amount <= betLimit; 
        }). 
    WithMessage(string.Format("Bet should be less than {0}", "bet limit value should be placed here", betLimit)); 
    ... 
} 

UPDATE:

我現在看到您從視圖模型添加帕拉姆。看起來你應該能夠得到像這樣的基礎上,在FluentValidation文檔here第三個例子:

public ViewModelValidator(IBattlesService battlesService) 
    { 
     RuleFor(mb => mb.Amount). 
     Must((mb, amount) => 
         { 
          mb.Amount <= betLimit; 
         }). 
     WithMessage("Bet should be less than {0}", mb => battlesService.GetBetLimit(mb.BattleId)); 
     ... 
    } 
+0

其實betLimit檢索是基於MB的一些其他屬性。我只是試圖簡化一個例子,並使它有點錯誤 – SiberianGuy

+0

但是betLimit裏面必須來自你的第二個例子嗎? – SiberianGuy

+0

啊我不好,我專注於WithMessage部分。看起來你將不得不打兩次服務。如果兩個服務往返導致痛苦,可以將結果緩存在HttpContext中......但我無法想象有一種方法可以從Must規則中與WithMessage進行通信。 –