2011-09-15 27 views
5

Tôi có đoạn code sau trong validator:FluentValidation qua tham số để 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"); 

Có cách nào để vượt qua giá trị betLimit phương pháp WithMessage? Giải pháp duy nhất tôi thấy là đặt giá trị betLimit thành một số thuộc tính của ViewModel và sau đó truy cập nó trong quá tải WithMessage với funcs. Nhưng nó là xấu xí.

Trả lời

4

Amount không được sử dụng để nhận số betLimit, bạn không thể kéo giới hạn đặt cược vào trường khi trình xác thực của bạn kích hoạt và sử dụng nó ở bất cứ nơi nào bạn muốn? Một cái gì đó như:

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:

Tôi thấy bây giờ mà bạn đã thêm param từ mô hình xem. Hình như bạn sẽ có thể để có được nó như thế này, dựa trên ví dụ thứ ba trong tài liệu 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

Trên thực tế betLimit hồi được dựa trên một số tài sản khác của mb. Tôi chỉ cố gắng để đơn giản hóa một ví dụ và làm cho nó một chút sai – SiberianGuy

+0

Nhưng nơi nào betLimit bên trong Phải đến từ trong ví dụ thứ hai của bạn? – SiberianGuy

+0

Ah tệ hại của tôi, tôi đã tập trung vào phần WithMessage. Có vẻ như bạn sẽ phải nhấn dịch vụ đó hai lần. Nếu hai vòng dịch vụ gây ra đau, bạn có thể cache kết quả của điều đó trong HttpContext ... nhưng tôi không thể tưởng tượng có một cách để lấy thứ gì đó từ quy tắc Must để giao tiếp với cuộc gọi WithMessage. –

Các vấn đề liên quan