RegularExpressionValidator VS Ajax 1.0.20229 - PullRequest
14 голосов
/ 28 июля 2010

У нас есть веб-сайт, который работает .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 ]

2 голосов
/ 04 мая 2013

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

Первый источник -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 голосов
/ 09 апреля 2013

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...