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 в элемент управления и затем показал бы мне красную звездочку рядом с ним, когда выражение не совпадало.

Редактировать:

Вот элемент управления, полностью скопированный:

<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" />

2 ответа

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

Во-первых, это источник -1.7976931348623157E+308, Это равно Minimum собственностью AjaxControlToolkit.NumericUpDownBehavior который вызывается в одном из обработчиков событий Sys.Application.init:

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
            }
        }
    }

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

Другие вопросы по тегам