2013-05-19 38 views
6

Tôi có một hình thức trong đó sử dụng một kendo-ui numericTextBoxjquery validate ẩn điều khiển kendo-ui

@Html.LabelFor(p => p.Cost) 
@Html.TextBoxFor(p => p.Cost, new { @autocomplete = "off" }) 

tôi ràng buộc nó, sau đó, để làm cho nó làm việc với plugin jquery validate, tôi thiết lập các cài đặt sau:

$("#Cost").kendoNumericTextBox({ 
    format: "c", 
    min: 0, 
    decimals: 2 
}); 

$.validator.setDefaults({ 
    ignore: [], 
    highlight: function (element, errorClass) { 
     element = $(element); 
     if (element.hasClass("k-input")) { 
      element.closest(".k-widget").addClass(errorClass); 

     } else { 
      element.addClass(errorClass); 
     } 
    }, 
    unhighlight: function (element, errorClass) { 
     element = $(element); 
     if (element.hasClass("k-input")) { 
      element.closest(".k-widget").removeClass(errorClass); 
     } else { 
      element.removeClass(errorClass); 
     } 
    } 
}); 

Khi tôi cố gắng gửi biểu mẫu và đầu vào Cost không hợp lệ, nó thêm đúng ErrorClass (trên .k-widget trình bao bọc).

Vấn đề là nếu tôi nhấn nút gửi lần nữa, thì phần tử kendo-ui sẽ biến mất (với style="display: none;").

Tôi không biết điều gì đang kích hoạt tính năng này. Tôi đã thấy rằng nếu tôi thay đổi errorClass thành một cái gì đó khác ngoài input-validation-error, thì tiện ích kendo-ui vẫn hiển thị.

Sự cố này chỉ xảy ra với các điều khiển kendo-ui, không phải với các đầu vào html chuẩn.

Tôi đang làm điều gì đó sai?

+0

Bạn chưa hiển thị đủ mã để sao chép bất kỳ thứ gì. HTML được hiển thị ở đâu trong biểu mẫu? '.validate()' được khai báo ở đâu? – Sparky

+0

@RaraituL Bạn đã từng đưa ra giải pháp cho điều này chưa? Tôi đang gặp vấn đề tương tự. – aw04

Trả lời

7

Tôi đặt cược rằng điều khiển hộp số bằng số được bao bọc hai mặt giống như điều khiển datepicker. Sau đây là các highlight()unhighlight() chức năng tôi sử dụng trong cấu hình validator tôi để xác định những yếu tố để áp dụng các lớp lỗi:

... 
highlight: function (element, errorClass, validClass) { 
    var e = $(element), 
     parent = _getParent(e); 

    _addClass(e, parent); 
    }, 
unhighlight: function (element, errorClass, validClass) { 
    var e = $(element), 
     parent = _getParent(e); 

    _removeClass(e, parent); 
} 
... 

function _getParent(element) { 
    // a Kendo DatePicker is double-wrapped, so that requires us to return the parent of the parent 
    return (element.parent().hasClass('k-picker-wrap')) ? element.parent().parent() : element.parent(); 
} 

function _addClass (element, parent) { 
    if (parent.hasClass('k-widget')) { 
    parent.addClass('error'); 
    } else { 
    element.addClass('error'); 
    } 
} 

function _removeClass(element, parent) { 
    if (parent.hasClass('k-widget')) { 
    parent.removeClass('error'); 
    } else { 
    element.removeClass('error'); 
    } 
} 
+0

Tôi đã thực hiện một giải pháp rất giống với giải pháp này, ngoại trừ việc thay vì tìm kiếm lớp css '.k-picker-wrap', tôi đang tìm lớp' .k-widget', tất cả các điều khiển 'kendo ui' có nó – Catalin

+0

@RaraituL Hmmm, đây là những gì tôi đã làm cũng như để tìm các yếu tố, nhưng nào tôi chọn nó vẫn đặt "hiển thị: không" trên đệ trình thứ hai. – aw04

+1

@ aw04: Ahh, đúng vậy. Nếu tôi nhớ chính xác, đó là một đoạn mã trong plugin 'jquery.validate.unobtrusive' đang ẩn một điều khiển. Tôi nghĩ rằng chức năng này có trách nhiệm ẩn các điều khiển 'chức năng onError (lỗi, inputElement)'. Thật không may tôi không có mã nữa để biết chính xác – Catalin

2

Để khắc phục những vấn đề mà các phần tử biến mất vào thứ hai gửi, tôi đã làm điều này:

$("form").submit(function (event) { 
    $(".k-widget").removeClass("input-validation-error"); 
} 
Các vấn đề liên quan