5

Tôi đang tìm cách thực hiện xác thực tùy chỉnh không phô trương để Xác thực thông thạo. Theo documentation, nó dường như không chỉ ra nó hỗ trợ xác nhận không phô trương.Xác nhận tùy chỉnh/không điều kiện kín đáo với Xác thực thông thạo

Tương tự áp dụng cho việc sử dụng xác thực có điều kiện (When/Unless). Tôi nhìn thấy trong MVC documentation, xác nhận không phô trương của họ không được hỗ trợ với điều kiện và các xác nhận phức tạp:

Lưu ý rằng FluentValidation cũng sẽ làm việc với xác nhận client-side của ASP.NET MVC, nhưng không phải tất cả các quy định được hỗ trợ. Ví dụ: bất kỳ quy tắc nào được xác định bằng cách sử dụng điều kiện (với Khi/Trừ khi), trình xác thực tùy chỉnh hoặc cuộc gọi đến Phải sẽ không chạy ở phía máy khách. Các xác nhận sau được hỗ trợ trên máy khách:

* notnull/NotEmpty
* Matches (regex)
* InclusiveBetween (range)
* CreditCard
* Email
* EqualTo (cross-bất động sản so sánh bình đẳng)
* Chiều dài

Vì vậy, có ai tìm ra cách làm việc này không? Nếu không, có các tùy chọn xác thực khác cung cấp hỗ trợ tốt hơn cho việc xác thực tùy chỉnh/phức tạp không phô trương không?

+0

Bạn có thể cung cấp ví dụ cụ thể về những gì bạn đang cố gắng đạt được/xác thực không? Kịch bản chính xác của bạn là gì? –

+0

Vâng, chỉ cần sử dụng các phương pháp When/Trừ khi không hoạt động không phô trương, ra khỏi hộp anyway.Ngay cả khi tôi có thể tìm ra giải pháp làm việc cho những người đó, điều đó sẽ giúp tôi tiến gần hơn một bước. Có khả năng, nếu nó hoạt động w/điều kiện như Khi/Trừ khi, nó có lẽ sẽ làm việc w/xác nhận tùy chỉnh là tốt. –

Trả lời

1

Tôi đã cắm FluentValidation vào ASP.NET MVC 3 thành công, bằng cách thực hiện theo tài liệu Integration with ASP.NET MVC.

Cách đơn giản là cắm FluentValidation vào khung MVC Validation trong Global.asax Application_Start() như thế này:

FluentValidationModelValidatorProvider.Configure(); 

Sau đó, bạn có thể trang trí lớp học POCO của bạn với thuộc tính, xác định validator họ sử dụng.

[Validator(typeof(PersonValidator))] 
public class Person { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public string Email { get; set; } 
    public int Age { get; set; } 
} 

Trong trường hợp của tôi, tôi không muốn làm điều đó (sử dụng thuộc tính) và thực sự cần xác thực cùng một lớp POCO với các Trình xác thực khác nhau, tùy thuộc vào quy tắc kinh doanh.

Nếu bạn muốn chọn trình xác thực khác nhau theo cách đó, hãy làm theo các tài liệu trên "custom validator factory with an IoC container". Tạo lớp FluentMvcValidatorFactory phân lớp ValidatorFactoryBase, thực hiện giao diện IValidatorFactory. Nhà máy xác thực tùy chỉnh có thể xử lý việc chọn trình xác thực hợp lệ.

Tôi đã cố gắng để có được xác thực phía khách hàng làm việc (nó đã làm), nhưng nó dường như cũng cắm vào xác nhận không phô trương. Html của tôi là kết quả đầu ra như sau:

<input type="text" value="" name="Email" id="Email" data-val-length-max="128" data-val-length="&amp;#39;Email&amp;#39; must be between 0 and 128 characters." data-val-email="&amp;#39;Email&amp;#39; is not a valid email address." data-val="true" class="text-box single-line"> 

Miễn là bạn cắm nó vào MVC chính xác, tôi nghĩ không phô trương nên hoạt động.

Trong thực tế, bạn không nên phụ thuộc hoàn toàn vào xác thực phía khách hàng hoặc không phô trương, chỉ sử dụng nó để hỗ trợ người dùng trong khi nhập. Cuối cùng, máy chủ cần xác thực, nhưng bạn có thể có mã phía máy chủ của bạn sử dụng cùng trình xác thực FluentValidation.

+1

Cảm ơn bài đăng của bạn. Tôi thực sự có xác nhận tiêu chuẩn làm việc kín đáo, vấn đề là nhận được khi/Trừ khi xác nhận hợp lệ có điều kiện để làm việc, hoặc xác nhận tùy chỉnh (nơi tôi tạo quy tắc xác nhận của riêng mình). –

+0

Tôi thấy - vì vậy bạn muốn xác định các quy tắc xác nhận tùy chỉnh (điều kiện) bằng cách sử dụng FluentValidation và có các quy tắc đó được chuyển đổi thành các quy tắc jquery.unobtrusive.validation tùy chỉnh để xác thực phía máy khách không? Đó là những gì không được hỗ trợ. Vì vậy, nó sẽ có một mã tùy chỉnh để thu hẹp khoảng cách. Làm thế nào quan trọng là nó có các quy tắc tùy chỉnh ở phía khách hàng, không phải với một bài đăng máy chủ? Có lẽ nó là quá mức cần thiết. Một phần của lý do sử dụng FluentValidation là bạn viết ít mã hơn - cùng một quy tắc xác nhận hợp lệ trên máy khách và máy chủ. –

+1

Tôi đồng ý. Nhưng có nhiều trường hợp khi xác thực một số trường chỉ bắt buộc trong một số trường hợp (nghĩa là yêu cầu trường địa chỉ giao hàng nếu hộp kiểm "Giống như thanh toán" không được chọn). Đối với tôi, điều này có vẻ giống như một yêu cầu chung, và như bạn đã nói, tôi không muốn phải viết xác nhận riêng cho điều này vì việc xác thực không phô trương không làm việc cho những Khi nào/Trừ khi có điều kiện. –

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