9

Tôi đang sử dụng jQuery Validation Plugin, v1.11.0.2/4/2013 với jquery.validate.unobtrusive.js.Xác thực phạm vi số không hoạt động đúng trong jquery.validate.unobtrusive.js

Tôi đoán mình phải đối mặt với lỗi Xác thực phạm vi cho trường số: Xác thực so sánh Chuỗi giá trị với Chuỗi của Min và Chuỗi của Max, thay vì so sánh Số trường với số phút và số tối đa.

Repro-bước sau:

Bạn thiết lập phạm vi xác nhận 1-1000, sử dụng HTML sau:

<input name="Data.MaxConcurrentInstances" class="text-box single-line" id="Data_MaxConcurrentInstances" type="number" value="" data-val-number="The field Max concurrent instances must be a number." data-val="true" data-val-range-min="1" data-val-range-max="1000" data-val-range="The field Max concurrent instances must be between 1 and 1000."> 

Bạn đặt giá trị trường kiểm tra: 7.

Dự kiến ​​kết quả: Xác thực thành công. Không có lỗi.

Kết quả thực tế: Xác thực không thành công. Lý do nội bộ: không thành công vì chuỗi theo thứ tự chữ cái "7" xuất hiện sau chuỗi "1" và "1000", không phải giữa chúng.

Câu hỏi: Có phải lỗi này đã được biết? Cách giải quyết tốt nhất cho điều đó là gì?

Trả lời

7

Tôi cũng thấy vấn đề này. Tôi vừa xác nhận rằng nó được sửa trong bản cập nhật JQuery Validation 1.11.1 bằng cách cập nhật mã của tôi theo cách thủ công. Bản cập nhật chưa được xuất bản trên kho lưu trữ NuGET.

Bạn có thể tải bản cập nhật từ đây: địa chỉ http://bassistance.de/jquery-plugins/jquery-plugin-validation/

Microsoft CDN là:

http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.js

http://ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js


Update từ 3 tháng 4:

cập nhật gói NuGET hiện khả dụng. Nếu bạn cập nhật để Xác thực JQuery 1.11.1 qua NuGET, bạn sẽ gặp sự cố được khắc phục.

+0

Cảm ơn thông tin. bạn có thực sự kiểm tra nó không? Bởi vì tôi thấy các chủ đề khác, mọi người đã nói rằng điều này đã được sửa chữa một thời gian trước đây cho các phiên bản trước, nhưng nó không phải. Cũng có thông tin nào khi NuGet được cập nhật không? –

+0

Xin chào. Có, tôi thực sự đã thử nghiệm nó trên ứng dụng của tôi. Tôi đã có rất nhiều xác nhận phạm vi và tất cả chúng đều bị hỏng. Tôi chỉ thay thế nội dung tệp JS (ban đầu được cài đặt bởi NuGET) với phiên bản mới hơn (sao chép và dán) và tất cả các trang của tôi hiện đang hoạt động. Gói NuGET đã được phát hành ngay bây giờ. – Iravanchi

+0

Tôi vừa cập nhật xác thực JQuery trong trình quản lý NuGet cho các dự án của mình và bây giờ việc xác thực Phạm vi hoạt động tốt. –

1

Cho đến nay các workaround tốt nhất mà tôi tìm thấy đang chạy vá khởi động kịch bản:

$(document).ready(function() { 
    window.setTimeout(function() { 
     //Fixing jquery Unobtrusive validation range integer bug 
     var allRules = $.data(document.forms[0], "validator").settings.rules; 
     for (var ruleName in allRules) { 
      var rule = allRules[ruleName]; 

      if (rule.range != undefined && rule.number) 
       for (var ri = rule.range.length-1; ri >=0 ; ri--) { 
        rule.range[ri] = Number(rule.range[ri]); 
       } 
     } 
    }, 100); 
}); 
+0

Tôi gặp vấn đề tương tự. Các tác phẩm trên làm việc ở trên, nhưng có một lỗi nhỏ trong vòng lặp for/next. Thay thế dòng 9 bằng: "for (var ri = rule.range.length - 1; ri> = 0; ri--) {". Tôi đã cập nhật, nhưng thay đổi phải được phê duyệt bởi đánh giá ngang hàng. – Pando

+0

Bạn có thể giải thích lý do bạn đề xuất liệt kê theo thứ tự ngược lại không? –

+0

Để có hiệu suất tốt hơn, bạn không muốn đánh giá độ dài của mảng trong mỗi lần lặp. Có một số cách khác nhau để thực hiện việc này. Kiểm tra http://www.openjs.com/articles/for_loop.php – Pando

0

Một trong những cách giải quyết sẽ được ghi đè lên các phương pháp loạt các jquery validator như sau:

$.validator.methods.range = function (value, element, param) { 
     return this.optional(element) || (Number(value) >= Number(param[0]) && Number(value) <= Number(param[1])); 
    } 

Mã thực tế đối với phạm vi trong các plugin validator là

range : function (value, element, param) { 
      return this.optional(element) || (value >= param[0] && value <= param[1]); 
     } 

On chuyển đổi kiểu String giá trị trong các value, param[0] and param[1] để loại số sử dụng Number(value), Number(param[0]) and Number(param[1]) một so sánh thích hợp xảy ra giữa số và không giữa chuỗi.

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