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", которые не существуют (ноль символов)?