2010-07-28 13 views
14

Mamy stronę internetową, która działa pod numerem .NET Framework 2.0 z Ajax version 10618.RegularExpressionValidator VS Ajax 1.0.20229

Ale jak to jest, jest to stara wersja biblioteki dll, więc planowaliśmy zmienić ją na "najnowszą" wersję dla .NET Framework 2.0, AjaxControlToolkit version 20229.

W naszych testach wykryliśmy problem z kontrolką ASP RegularExpressionValidator, która działała dobrze w starej wersji.

Gdy dane wejściowe do kontrolki docelowej nie pasują do sprawdzania poprawności, kontrolka wyświetla mój tekst , który w tym przypadku jest czerwoną gwiazdką uporządkowaną, np. W następnym wierszu, i wyświetla następujący tekst w kontrolce : "-1.7976931348623157e+308".

Nie ma nic złego w wyrażeniu, ponieważ, jak powiedziałem, działa dobrze w starszej wersji Ajax i nie mogłem znaleźć niczego związanego z wersjami RegularExpressionValidators i Ajax.

PS: Zarówno walidator, jak i kontrolka znajdują się wewnątrz modułu UpdatePanel.

PS 2: W starszej wersji oznaczałoby to 0 w kontrolce, a następnie pokazało mi czerwoną gwiazdkę obok niej, gdy wyrażenie nie pasowało.

Edit:

Tutaj jest kontrola, w pełni kopiowane:

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

I ma też NumericUpAndDownExtender z nim związane:

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

Wiem, że to stare pytanie, ale jeśli nadal masz problemy: czy możesz zamieścić swój kod projektanta? Interesujące byłoby sprawdzenie go i sprawdzenie, czy jest to zmiana w sposobie obsługi wyrażenia regularnego przez kontrolkę lub w jaki sposób napisany jest javacript. – Peter

+0

@Patricker Ok, dodano kod. Przepraszam, że trwało to długo. – Smur

+0

Zakładam, że problem nadal występuje, ponieważ zaktualizowałeś swoje pytanie, prawda? – Peter

Odpowiedz

-1

Patrząc na komunikat o błędzie, oznacza testowana liczba znajduje się poza granicami wyrażenia. Jedyne dopuszczalne liczby to od 0 do 9999. Dozwolone są żadne litery, znaki interpunkcyjne i inne znaki. Druga część wyrażenia zapewnia zakotwiczenia wokół liczby, zarówno jako początek, jak i koniec linii lub słowa. Jedyną inną dozwoloną wartością jest NULL, co prawdopodobnie oznacza, że ​​aktualizacja jest bardziej restrykcyjna i podaje błąd. Na przykład, jak sprawdzić poprawność liczby lub cyfry "\ d", która nie istnieje (zero znaków)?

+0

-1: dlaczego więc zmieniła się z wersją AJAX? –

+0

Moje założenie (czy są one dozwolone?) To te nowsze wersje błędów, które naprawiają błędy. Posiadanie sprawdzania poprawności zdefiniowanego jako liczba, ale dopuszczenie tej wartości do wartości NULL jest błędem. Prawidłowe wyrażenie regularne do sprawdzenia od 1 do 4 cyfr jest "^ \ d {1,4} $", a nie 0,4. –

+0

Czy to -1, bo nie zgadzałem się z czymś? Moja odpowiedź była skierowana na to, że wyrażenie regularne jest błędne, co jest błędne w każdym języku, a nie tylko w AJAX. Wartość -1 nie jest uzasadniona i jest nieuzasadniona. –

2

Ok, mam ten sam problem i tutaj są moje wnioski:

pierwsze jest źródłem -1.7976931348623157E+308. Jest ona równa nieruchomości Minimum z AjaxControlToolkit.NumericUpDownBehavior który nazywany jest w jednym z Sys.Application.init Event teleskopowe:

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

Więc tutaj nie magia, tylko minimalna wartość Double. Minimum to nowa właściwość w porównaniu z wersją 10618.

Następnie, dlaczego jest wyświetlana zaraz po wyświetleniu strony? Dzieje się tak, ponieważ w funkcji readValue, która jest zdefiniowana w AjaxControlToolkit.NumericUpDownBehavior.prototype, wartość this._min (która jest równa Minimum parametr z $create) jest przypisana do wejścia, jeśli jest pusta.readValue źródła:

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]); 
      } 
     } 
    } 

Przed Minimum w wersji 10618, wartość domyślna to 0. Więc myślę, że opisany problem może być rozwiązany poprzez określenie Minimum wartość bezpośrednio w deklaracji przedłużającego:

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

Inna sprawa, że ​​znalazłem to, że change prace zdarzeń wysyłki źle w nowej wersji IE (aby to działało Widok zgodności powinien być włączony, ale myślę, że nie jest to opcja dla publicznych stron internetowych).

Problem dotyczy funkcji setCurrentToTextBox. event Obiekt jest zawsze null w procedurach obsługi (na przykład procedurach sprawdzania poprawności), jeśli zostały utworzone przy użyciu document.createEvent. Aby rozwiązać ten problem, warunek powinien zostać zamieniony, aby wszystkie zdarzenia w IE zostały utworzone przy użyciu 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 
      } 
     } 
    } 
Powiązane problemy