RegularExpressionValidator VS Ajax 1.0.20229

У нас есть веб-сайт с .NET Framework 2.0 с Ajax version 10618.

Но как бы то ни было, это старая версия DLL, поэтому мы планировали переключить ее на "новейшую" версию для .NET Framework 2.0, AjaxControlToolkit version 20229.

В наших тестах мы обнаружили проблему с элементом управления ASP RegularExpressionValidator, который отлично работал со старой версией.

Всякий раз, когда ввод целевого элемента управления не соответствует проверке, элемент управления отображает мои текст, который в этом случае представляет собой красную звездочку, расположенную, например, в следующей строке, и она отображает следующее в элементе управления: "-1.7976931348623157e+308".

Нет ничего плохого в выражении, потому что, как я сказал, он отлично работает со старой версией Ajax, и я не мог найти ничего, связанного с версиями RegularExpressionValidators и Ajax.

PS: и валидатор, и элемент управления находятся внутри UpdatePanel.

PS 2: со старой версией он поставит 0 в элемент управления, а затем покажет мне красную звездочку рядом с ней, когда выражение не будет соответствовать.

Edit:

Здесь элемент управления полностью скопирован:

<asp:RegularExpressionValidator ID="ValidateFooOrder" 
runat="server" ControlToValidate="txtFooNum"                                                    
Text="*" ErrorMessage="Invalid Foo number" 
ValidationExpression="^\d{0,4}$" ValidationGroup="GenerateFooFile" />

И он также имеет прикрепленный к нему NumericUpAndDownExtender:

<ajaxToolkit:NumericUpDownExtender ID="NumericExtenderFooNum" 
runat="server" TargetControlID="txtFooNum"                                                    
TargetButtonDownID="FooBack" TargetButtonUpID="FooForward" />

Ответы

Ответ 1

Хорошо, у меня такая же проблема, и вот мои выводы:

Сначала источник -1.7976931348623157E+308. Он равен свойству Minimum AjaxControlToolkit.NumericUpDownBehavior, который вызывается в одном из обработчиков Sys.Application.init Event:

Sys.Application.add_init(function() {
    $create(AjaxControlToolkit.NumericUpDownBehavior, {"Maximum":1.7976931348623157E+308,"Minimum":-1.7976931348623157E+308, /* other non relevant stuff */);
});

Итак, здесь нет магии, минимальное значение Double. Minimum - это новое свойство по сравнению с версией 10618.

Затем, почему он отображается, как только отображается страница? Это происходит потому, что внутри readValue функция, которая определена в AjaxControlToolkit.NumericUpDownBehavior.prototype, значение this._min (которое равно параметру Minimum из $create) назначается для ввода, если оно пустое. readValue Источники:

readValue : function() {
        /// <summary>
        /// Parse value of textbox and this._currentValue to be that value.
        /// this._currentValue = this._min if some there is an exception
        /// when attempting to parse.
        /// Parse int or string element of RefValues
        /// </summary>

        if (this._elementTextBox) {
            var v = this._elementTextBox.value;
// The _currentValue of NumericUpDown is calculated here 
            // if textbox empty this._currentValue = this._min
            if(!this._refValuesValue) {
                if(!v) {
                    this._currentValue = this._min;
                } else {
                    try {
                        this._currentValue = parseFloat(v);
                    } catch(ex) {
                        this._currentValue = this._min;
                    }
                }
                if(isNaN(this._currentValue)) {
                    this._currentValue = this._min;
                }
// And assigned here. In case of empty input we will get -1.7976931348623157E+308 if Minimum was not changed
                this.setCurrentToTextBox(this._currentValue);
                this._valuePrecision = this._computePrecision(this._currentValue);
            } else {
                if(!v) {
                    this._currentValue = 0;
                } else {
                    var find = 0;
                    for (var i = 0; i < this._refValuesValue.length; i++) {
                        if (v.toLowerCase() == this._refValuesValue[i].toLowerCase()) {
                            find = i;
                        }
                    }
                    this._currentValue = find;
                }
                this.setCurrentToTextBox(this._refValuesValue[this._currentValue]);
            }
        }
    }

До Minimum, в версии 10618 значение по умолчанию 0. Поэтому я думаю, что описанная проблема может быть решена путем указания значения Minimum явно в объявлении расширителя:

<ajaxToolkit:NumericUpDownExtender ID="NumericExtenderFooNum" runat="server" 
     Minimum="0"
     TargetControlID="txtFooNum"
     TargetButtonDownID="FooBack" TargetButtonUpID

Другая вещь, которую я обнаружил, заключается в том, что change диспетчеризация событий работает неправильно в новых версиях IE (чтобы заставить ее работать, представление совместимости должно быть включено, но я думаю, что это не вариант для общедоступных веб-сайтов).

Проблема заключается в функции setCurrentToTextBox. event объект всегда null в обработчиках (например, обработчики проверки), если они созданы с помощью document.createEvent. Чтобы исправить эту проблему, условие должно быть заменено, поэтому все события в IE будут созданы с помощью createEventObject.

// Current implementation of version 20229
setCurrentToTextBox : function(value) {
            // full sources are not shown, only if matters here

            if (document.createEvent) {
                // event is created using createEvent
            } else if( document.createEventObject ) {
                // event is created using createEventObject 
            }
        }
    }

// Updated implementation
setCurrentToTextBox : function(value) {
            // full sources are not shown, only if matters here

            if (document.createEventObject) {
                // event is created using createEventObject 
            } else if(document.createEvent) {
                // event is created using createEvent
            }
        }
    }

Ответ 2

Глядя на сообщение об ошибке, подразумевается, что тестируемое число выходит за границы выражения. Разрешенные номера находятся только между 0 и 9999. Никакие буквы, знаки препинания или другие символы не допускаются. Другая часть выражения утверждает привязки вокруг числа, как начало, так и конец строки или слова. Единственное допустимое значение - NULL, вероятно, там, где обновление является более строгим и дает ошибку. Например, как вы проверяете число или цифру "\ d", которая не существует (нулевые символы)?