2012-02-12 29 views
13

Tôi đang cố thêm xác thực không phô trương tùy chỉnh vào ứng dụng của mình. Nó dường như không chạy xác thực.ASP .Net MVC 3: Xác thực không phô trương tùy chỉnh

Đây là lớp Thuộc tính của tôi:

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context) 
{ 
    yield return new ModelClientValidationRule 
    { 
     ErrorMessage = ErrorMessage, 
     ValidationType = "custrequired" 
    }; 
} 

Và JavaScript của tôi:

$.validator.addMethod('custrequired', function(value, element, param) { 
    return value && value !== '99:99' && value !== '9:99'; 
}); 

$.validator.unobtrusive.adapters.add('custrequired', null, function(options) { 
    return options.messages['custrequired'] = options.message; 
}); 

Trả lời

31

Có rất nhiều thứ có thể đi sai ở đây, không ai liên quan đến mã bạn đã đăng:

  • Làm thế nào để tạo ra HTML của bạn cho giao diện <input>? Nó có bao gồm thuộc tính data-val-custrequired không?

  • Nếu không, bạn có nhớ thêm giao diện trong tuyên bố lớp học - IClientValidatable không?

  • Bạn nhớ để không thêm validator tùy chỉnh của bạn bên trong một handler DOM ready? (ví dụ: không sử dụng $(document).ready() hoặc $(function() { ... })) - việc xác thực phải được thiết lập trước khi tài liệu sẵn sàng.

ETA: Lý do cho người cuối cùng là jquery.validate.unobtrusive thực hiện điều này:

$(function() { 
    $jQval.unobtrusive.parse(document); 
}); 

Tức là, nó phân tích các tài liệu cho các thuộc tính xác nhận, các quy tắc vv trên tài liệu đã sẵn sàng. Vì tập lệnh đó phải được tải để đăng ký bộ điều hợp của bạn, tập lệnh đăng ký của bạn thường sẽ phải đến saujquery.validate.unobtrusive.js. Nhưng điều đó cũng làm cho bất kỳ trình xử lý .ready nào bạn đăng ký được gọi là sau chế độ "không phô trương" - vào thời điểm quá muộn. Tôi đoán bạn có thể đặt kịch bản đăng ký của bạn trước và sau đó sử dụng .ready. Chưa bao giờ thử nó, và tôi chưa từng thấy nó.

Ngoài ra, trong trường hợp này, điều này sẽ đủ để đăng ký adapter:

$.validator.addMethod('custrequired', function(value, element, param) { 
    return value && value !== '99:99' && value !== '9:99'; 
}); 

jQuery.validator.unobtrusive.adapters.addBool('custrequired'); 

Nó vẫn sẽ bổ sung thêm bất kỳ thông báo lỗi tùy chỉnh bạn có thể có, nhưng kể từ khi xác nhận bạn không sử dụng tham số bổ sung (như ví dụ: StringLength vượt qua MaximumLength v.v.), không cần bộ điều hợp tùy chỉnh.

+0

Tôi đã thêm trình xác thực trong '$ (function() {...})' ... tôi có thể biết lý do tại sao tính năng này không hoạt động không? – Moon

+0

@Moon - Được chỉnh sửa với một lời giải thích. – JimmiTh

+2

Trong trường hợp của tôi nó không hoạt động vì tôi đã có mã bên trong '$ (document.ready()' .Câu trả lời tuyệt vời! Đã giúp rất nhiều ... –

3

Có một vài vấn đề với $.validator.unobtrusive.adapters.add gọi:

$.validator.unobtrusive.adapters.add('custrequired', function (options) { 
// -------------------------------------------------^ <-- removed "null" param 
    options.messages['custrequired'] = options.message; 
    // Register the rule properly 
    options.rules['custrequired'] = options.params; 
    // Don't return anything 
}); 

Sau hai thay đổi (và đảm bảo rằng ClientValidation và UnobtrusiveJavascript đã được bật trong web.config), s làm việc tốt.

+0

Cảm ơn rất nhiều về phản hồi. Nhưng vẫn không thể làm cho nó hoạt động. – Moon

+0

@Moon bạn có bất kỳ lỗi nào trên trang không? –

0

Bạn phải thay đổi phía máy chủ.

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(
    ModelMetadata metadata, ControllerContext context) 
    { 
     //I changed ErrorMessage for ErrorMessageString 
     yield return new ModelClientValidationRule 
     { 
     ErrorMessage = ErrorMessageString, 
     ValidationType = "custrequired" 
     }; 
    } 

Và cũng như Andre Whitaker cho biết bạn phải đặt điều này để thêm xác thực của bạn vào bên cạnh.

//i changed param for params 
    $.validator.addMethod('custrequired', function(value, element, params) { 
     return value && value !== '99:99' && value !== '9:99'; 
    }); 

    //i specified that there isn't paramaters using an empty array. 
    $.validator.unobtrusive.adapters.add('custrequired', [] , function (options) { 
     options.messages['custrequired'] = options.message; 
     options.rules['custrequired'] = options.params; 
    }); 

Hãy nhớ kiểm tra mã HTML của INPUT, nó cần phải có "đĩa dữ liệu" bằng thuộc BẠN LỖI tin nhắn văn bản

Tôi hy vọng nó làm việc cho bạn.

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