У меня тоже была эта проблема. Потратив слишком много времени на анализ API проверки на стороне клиента MS;), я проследил проблему до странной проблемы с анализом DOM, ниже я объясню, почему это происходит в некоторых случаях, и решение, которое я использовал для его устранения.
[Почему это происходит?]
Каждый элемент управления validator отображается как диапазон с нестандартными атрибутами, которые используются для выполнения проверки на стороне клиента. Например атрибут оценки функции ниже:
<span id="...id" controltovalidate="...BillingName" errormessage="blah" evaluationfunction="RequiredFieldValidatorEvaluateIsValid" display="Dynamic" initialvalue="" >*</span>
Эти атрибуты анализируются платформой в API, как показано ниже (обратите внимание на eval):
for (i = 0; i < Page_Validators.length; i++) {
val = Page_Validators[i];
if (typeof(val.evaluationfunction) == "string") {
eval("val.evaluationfunction = " + val.evaluationfunction + ";");
}
}
проблема в том, что специальные атрибуты, т. Е. Функция оценки, мы всегда возвращаем неопределенной, чтобы строка никогда не преобразовывалась в надлежащий объект валидатора. Для меня это все еще остается загадкой, потому что из того, что я могу сказать, это кажется совершенно случайным.
Что происходит, когда запускается Page_ClientValidate, он пытается вызвать каждую функцию проверки валидаторов, но не может этого сделать, потому что functionfunction == undefined. Вместо использования false в качестве значения по умолчанию он принимает значение true, поэтому проверка на самом деле не происходит, и все кажется действительным со стороны клиента. if (typeof (val.evaluationfunction) == "function") никогда не имеет значения true, поэтому он возвращается к предыдущему присваиванию val.isvalid = true; .
function ValidatorValidate(val, validationGroup, event) {
val.isvalid = true;
if ((typeof(val.enabled) == "undefined" || val.enabled != false) && IsValidationGroupMatch(val, validationGroup))
{
if (typeof(val.evaluationfunction) == "function")
{
val.isvalid = val.evaluationfunction(val);
if (!val.isvalid && Page_InvalidControlToBeFocused == null && typeof(val.focusOnError) == "string" && val.focusOnError == "t")
{
ValidatorSetFocus(val, event);
}
}
}
ValidatorUpdateDisplay(val);
}
[Как я это исправил?]
Чтобы исправить это, я написал подпрограмму, которую можно вызывать после завершения загрузки DOM. Эта процедура зацикливает все элементы управления валидатора и пытается создать свойства объекта из необработанных данных разметки в SPAN с использованием JQuery, хотя вы, вероятно, могли бы использовать любой другой эквивалентный инструмент для получения того же результата. Эта процедура не фиксирует все элементы управления валидатора, в основном обязательные валидаторы полей и валидаторы регулярных выражений. Вам нужно будет изменить его, если вы используете другие элементы управления проверкой, которые имеют дополнительные свойства.
function fixValidatorProperties()
{
if (Page_Validators && Page_Validators[0] && Page_Validators[0].evaluationfunction == undefined)
{
var val = null;
for (i = 0; i < Page_Validators.length; i++)
{
val = Page_Validators[i];
if (val.initialvalue == undefined)
val.initialvalue = "";
if ($(val).attr("evaluationfunction"))
eval("val.evaluationfunction = " + $(val).attr("evaluationfunction") + ";");
if ($(val).attr("controltovalidate"))
val.controltovalidate = $(val).attr("controltovalidate");
if ($(val).attr("errormessage"))
val.errormessage = $(val).attr("errormessage");
if ($(val).attr("Dynamic"))
val.Dynamic = $(val).attr("Dynamic");
if ($(val).attr("initialvalue"))
val.initialvalue = $(val).attr("initialvalue");
if ($(val).attr("ValidationExpression"))
val.validationexpression = $(val).attr("ValidationExpression");
}
}
}