Это эндемическая проблема с датчиками jQuery и средствами проверки ASP.
Как вы говорите, неправильный элемент вызывает перекрестную запуск подпрограммы проверки подлинности JavaScript NET NET, а затем M $ -код выдает ошибку, потому что запускающий элемент в подпрограмме не определен.
Я решил эту проблему иначе, чем кто-либо другой, которого я видел, - решив, что M $ должен был написать свой код более надежно, и, следовательно, переопределил часть кода валидатора M $, чтобы справиться с неопределенным элементом. Все остальное, что я видел, по сути является обходным путем на стороне jQuery и исключает возможную функциональность (например, использование события click вместо change).
Неудачный бит
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
, который выдает ошибку, когда пытается получить длину для неопределенных 'vals'.
Я только что добавил
if (vals) {
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
}
и ей хорошо идти. Окончательный код, который заново объявляет всю нарушающую функцию, приведен ниже. Я поставил его как сценарий включения в внизу моей главной страницы или страницы (так что это происходит после объявлений по умолчанию и заменяет более раннюю версию).
Да, это нарушает совместимость, если M $ решит изменить свой код валидатора в будущем. Но можно надеяться, что они исправят это, и тогда мы сможем полностью избавиться от этого патча.
// Fix issue with datepicker and ASPNET validators: redeclare MS validator code with fix
function ValidatorOnChange(event) {
if (!event) {
event = window.event;
}
Page_InvalidControlToBeFocused = null;
var targetedControl;
if ((typeof (event.srcElement) != "undefined") && (event.srcElement != null)) {
targetedControl = event.srcElement;
}
else {
targetedControl = event.target;
}
var vals;
if (typeof (targetedControl.Validators) != "undefined") {
vals = targetedControl.Validators;
}
else {
if (targetedControl.tagName.toLowerCase() == "label") {
targetedControl = document.getElementById(targetedControl.htmlFor);
vals = targetedControl.Validators;
}
}
var i;
if (vals) {
for (i = 0; i < vals.length; i++) {
ValidatorValidate(vals[i], null, event);
}
}
ValidatorUpdateIsValid();
}