2011-11-05 29 views
24

Có cách nào để vô hiệu hóa Xác thực jQuery cho một trình xác nhận hợp lệ nhất định (thẻ tín dụng) để nó chỉ xảy ra onblur, thay vì onkeyup không?Xác thực jQuery ASP.net MVC 3; Vô hiệu hóa OnKeyUp không phô trương?

Dựa trên các tài liệu hướng dẫn jQuery Validator Tôi nghĩ tôi có thể làm một cái gì đó như thế này:

$(function() { 
    $("[data-val-creditcard]").validate({ 
     onkeyup: false 
    }) 
}); 

Tuy nhiên, nó dường như không được làm việc.

Tôi cũng đã cố gắng làm như sau trên validator của tôi:

public class CreditCardValidator : DataAnnotationsModelValidator<CreditCardAttribute> 
{ 
    string _message; 

    public CreditCardValidator(ModelMetadata metadata, ControllerContext context, CreditCardAttribute attribute) 
     : base(metadata, context, attribute) 
    { 
     _message = attribute.ErrorMessage; 
    } 

    public override IEnumerable<ModelClientValidationRule> GetClientValidationRules() 
    { 
     var rule = new ModelClientValidationRule 
     { 
      ErrorMessage = _message, 
      ValidationType = "creditcard" 
     }; 
     rule.ValidationParameters.Add("onkeyup", false); 
     return new[] { rule }; 
    } 
} 

Nó không làm việc một trong hai, nhưng tôi chỉ tham gia một đâm vào sử dụng hợp lý ValidationParameters.

Thật khó chịu khi nhập số thẻ tín dụng vào biểu mẫu và thay đổi ngẫu nhiên từ không hợp lệ thành hợp lệ, sau đó quay lại không hợp lệ.

Bất kỳ ý tưởng nào? Cảm ơn!

Trả lời

17

Ok guys,

tôi ở cùng một vấn đề và tìm thấy chủ đề này: http://old.nabble.com/-validate--onkeyup-for-single-field-td21729097s27240.html

Ý tưởng cơ bản là ghi đè lên các sự kiện KeyUp và trả về false. Vì vậy, trong trường hợp cụ thể của bạn, bạn sẽ cần phải thêm:

$('#my-form').validate({ 
    rules: { 
    [...] 
    } 
} 
// Disable keyup validation for credit card field 
$("[data-val-creditcard]").keyup(function() { return false }); 

Và bạn sẽ thấy rằng lĩnh vực thẻ tín dụng của bạn chỉ được kiểm tra trên mờ hoặc trình (nhưng phần còn lại đang làm việc trên KeyUp cũng).

Tôi đang tìm kiếm giải pháp tương tự và nhận thấy rằng câu trả lời ở đây có thể được cải thiện, vì vậy tôi nghĩ sẽ thật tuyệt khi chia sẻ ở đây.

+2

về cách tắt khóa bằng cách trả về false. – Sam

+0

Đây là phương pháp duy nhất tôi tìm thấy đã có thể ngăn chặn việc xác thực khóa. Đó là quá nhiều như tôi đã thực hiện một cuộc gọi ajax để xác nhận đầu vào. Cuối cùng, tôi thiết lập một thuộc tính data trên phần tử input được kiểm soát bởi kết quả ajax của một sự kiện onchange cho phần tử input. Điều này cho phép jquery xác thực để có một trả về đơn giản là true hoặc false trong khi vẫn thực hiện một yêu cầu tới máy chủ để xác thực cơ sở dữ liệu. –

+1

Có một số sự kiện để ngăn chặn, tôi đã tạo một trình giữ chỗ đơn giản cho chúng, 'var fnfalse = function() {return false; } ', và sau đó được sử dụng để chặn chức năng,' $ (phần tử) .keyup (fnfalse) .blur (fnfalse) .focusout (fnfalse); '. –

5

Không biết làm thế nào để đặt nó vào một lĩnh vực cụ thể, nhưng bạn có thể thử này để tắt KeyUp xác nhận (cho tất cả các lĩnh vực):

$.validator.setDefaults({ 
    onkeyup: false 
}) 

Xem

+0

Vâng, tôi đã thấy điều đó. Tôi thích nó trên hầu hết các lĩnh vực, chỉ cần không phải là lĩnh vực thẻ tín dụng hoặc các lĩnh vực xác nhận từ xa (Tôi muốn chờ đợi để đạt các trang web một lần onblur thay vì trên mỗi thay đổi của một nhân vật). Có thể chỉ là một hạn chế mà tôi phải sống cùng. Tôi có thể sẽ làm setDefaults toàn cục như bạn đã đề cập ở trên ... – Sam

+0

... Lúc đầu, tôi đã thiết lập điều này bằng cách sử dụng để đảm bảo tài liệu và tập lệnh đã được tải và sẵn sàng sử dụng, nhưng nó không hoạt động. Tôi phải kéo nó ra để làm cho nó hoạt động, ví dụ: . Tuy nhiên, tôi tự hỏi điều gì sẽ xảy ra nếu người dùng chưa hoàn tất tải xuống các tập lệnh. Tôi đã đặt chúng ở dưới cùng của tài liệu thay vì trong đầu. – Sam

+0

Đã kết thúc chỉ cần vô hiệu hóa mẹo "tuyệt đối" trên – Sam

0

Bạn có thể đặt mặc định tắt ở chế độ onfocus sự kiện của trường tín dụng, sau đó biến chúng thành nhóm phát hành. Có vẻ như hacky, nhưng có thể làm việc.

20

$.validator.setDefaults không hoạt động để xác thực không phô trương khi trình xác thực được khởi tạo nội bộ.

Để thay đổi các thiết lập trên các hình thức sử dụng xác nhận không phô trương, bạn có thể làm như sau:

var validator = $("form").data("validator"); 
if (validator) { 
    validator.settings.onkeyup = false; // disable validation on keyup 
} 
+0

http://aspnet.uservoice.com/forums/41201-asp-net-mvc/suggestions/3583148-update-jquery-validate-unobtrusive-implementation- –

+0

Điều này sẽ vô hiệu hóa trình kích hoạt xác thực khóa cho tất cả các thành phần, phải không? Anh ta hỏi làm thế nào để vô hiệu hóa nó chỉ với 1 phần tử. – TweeZz

9

Tôi nhận ra đây là một bài cũ, nhưng không ai trong số các câu trả lời xuất hiện để trả lời câu hỏi này,

Làm thế nào để vô hiệu hóa onkeyup và bật onblur?

Tôi đang tìm kiếm điều này để nghĩ rằng tôi sẽ chia sẻ câu trả lời.

Như Ben Foster nói đúng, onkeyup có thể bị vô hiệu hóa bằng cách làm như sau

var validator = $("form").data("validator"); 
if (validator) { 
    validator.settings.onkeyup = false; 
} 

Để kích hoạt xác nhận onblur chúng ta có thể sử dụng onfocusout

validator.settings.onfocusout = function(element) 
{ 
    $(element).valid(); 
}; 

Vì vậy, mã của chúng tôi để vô hiệu hóa onkeyup và cho phép onblur tìm như thế này

var validator = $("form").data("validator"); 
     if (validator) 
     { 
      validator.settings.onkeyup = false; 
      validator.settings.onfocusout = function(element) 
      { 
       $(element).valid(); 
      }; 
     } 
1

Bạn cũng có thể sử dụng nội dung như trên,

$("form").validate({ 
    onfocusout: false, 
    onkeyup: false 
}); 

Trong trường hợp bạn có quy tắc tùy chỉnh sau đó,

$("form").validate({ 
    onfocusout: false, 
    onkeyup: false, 
    rules: { 
     "name1": { 
      required: true, 
      email: true, 
      maxlength: 100 
     }, 
     "name2": { 
      required: true, 
      number: true 
     } 
    } 
}); 

This answer trong diễn đàn jQuery giúp tôi rất nhiều.

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