2010-07-28 2 views
14

У нас есть сайт, который работает .NET Framework 2.0 с Ajax version 10618.RegularExpressionValidator VS Ajax 1.0.20229

Но, как бы то ни было, это старая версия 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" /> 
+0

Я знаю, что это старый вопрос, но если у вас все еще есть проблемы: можете ли вы разместить свой код дизайнера? Было бы интересно посмотреть на это и посмотреть, не изменилось ли это поведение регулятора или как написано javacript. – Peter

+0

@Patricker Хорошо, добавил код. Извините, потребовалось много времени. – Smur

+0

Я предполагаю, что проблема все еще происходит, так как вы обновили свой вопрос, верно? – Peter

ответ

-1

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

+0

-1: так почему это изменилось с помощью версии AJAX? –

+0

Мое предположение (разрешено?) - это то, что большинство новых версий ничего исправить ошибки. Наличие валидации, определяемой как число, но позволяющее этому значению быть NULL, является ошибкой. Правильное регулярное выражение для проверки числа от 1 до 4 цифр - «^ \ d {1,4} $" не 0,4. –

+0

Это -1, потому что я не согласен с чем-то? Мой ответ был направлен на неправильное регулярное выражение, которое неверно на любом языке, а не только на AJAX. -1 не является оправданным и необоснованным. –

2

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

Первый является источником -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 
      } 
     } 
    } 
Смежные вопросы