2011-11-15 10 views
5

Tôi đang sử dụng Fluent Validation trong dự án của mình.
Trong ViewModel của tôi, tôi có một thuộc tính có kiểu chuỗi, các giá trị hợp lệ chỉ là chuỗi đại diện cho các số nguyên dương.
Vì vậy, tôi đã tạo một đơn giản IntegerValidator để kiểm tra xem chuỗi có thể được phân tích cú pháp thành một số nguyên hay không. Những công việc này.
Vấn đề là cách thêm quy tắc phải là số nguyên dương? Tôi muốn sử dụng số Greater Than Validator hiện có, nhưng việc chuỗi nó vào quy tắc cho thuộc tính chuỗi của tôi sẽ so sánh nó với tên là string, không phải là một cú pháp được phân tích int. Làm thế nào để đạt được điều này?Quy tắc kết nối phụ thuộc vào nhau

Mẫu những gì tôi muốn làm (chú ý ToInt()):

RuleFor(x => x.BatchNumber).SetValidator(new IntegerValidator()) 
          .ToInt().GreaterThan(0); 
+0

Điều này thực sự có ý nghĩa! Tuy nhiên, tôi tự hỏi vai trò của ToInt là gì. Như tôi thấy, nó sẽ chuyển đổi một 'RuleBuilder ' thành 'RuleBuilder ' và đảm bảo rằng giá trị được xác thực được chuyển thành 'int' tại thời gian xác nhận. Nhưng ... chuỗi phương thức phải trả về một 'RuleBuilder '. Đúng? Vì vậy, phải có một cách để hướng dẫn các quy tắc 'int' liên tiếp (như' GreaterThan') để thực hiện xác nhận 'int', nhưng trả về một trình xây dựng quy tắc' chuỗi'. Tôi lo sợ điều này vượt quá khả năng hiện tại của FluentValidation. –

+0

@GertArnold: Vâng, 'ToInt' không có ý nghĩa quá nhiều, tôi nghĩ vậy. Tôi thực sự không quan tâm * làm thế nào * nó sẽ làm việc, chỉ cần * rằng * Tôi có thể sử dụng 'GreaterThan' và rằng một int được truyền cho' GreaterThan'. –

+0

Ok, điểm chính của tôi là trong tư duy hiện tại của Xác thực thông thạo, đó có thể là vấn đề khái niệm. –

Trả lời

1

Bạn luôn có thể sử dụng một phương pháp tùy chỉnh ...

RuleFor(x=>x.BatchNumber).Must(BeAPositiveIntegerString); 

private bool BeAPositiveIntegerString(string batchNumber) 
{ 
    // check both parse ability and greater than (once parsed) 
} 

Ít tái sử dụng nhưng sẽ làm việc ...

+0

Chắc chắn, tôi có thể làm điều đó, không có câu hỏi. Nhưng đó là chính xác những gì tôi muốn tránh và lý do tại sao tôi hỏi ở nơi đầu tiên :) –

+0

Tôi không thể tìm cách nào để tạo một 'RuleBuilder ' thành 'RuleBuilder '. Hệ thống phân cấp của các lớp đó đòi hỏi một sự thay đổi sâu sắc trong mã của FluentValidator, nhưng tôi muốn đề cập đến chúng; Tôi có thể thấy các trường hợp sử dụng tương tự. Trong trường hợp cụ thể này (để cung cấp cho bạn một câu trả lời khác), bạn luôn có thể chuỗi một trình xác nhận hợp lệ để kiểm tra dấu trừ trong chuỗi. ;) – drharris