ASP.NET RangeValidator Seltsamkeit mit MaximumValue

8

Ich habe eine ziemlich einfache ASP.NET-Seite mit einigen Eingabefeldern und Validatoren. Ein Feld, das ein Double akzeptiert, sieht folgendermaßen aus:

%Vor%

Dies funktioniert wie erwartet, und der Benutzer muss eine Zahl eingeben & gt; = 0.
Update: Das funktioniert nicht wie erwartet (irgendein seltsamer Fehler im Projekt) . Details zu den Antworten finden Sie unter

Ich versuche dann dasselbe für ein Feld, das eine Ganzzahl akzeptiert:

%Vor%

Beim Laden der ASP-Seite gibt dies den folgenden Fehler: Der Wert '' der MaximumValue-Eigenschaft von 'vdGrossTonnage' kann nicht in den Typ 'Integer' konvertiert werden.

Ich habe keine speziellen Max-Wert-Anforderungen im System, also würde ich gerne "default" auf Int32.MaxValue setzen (obwohl ich 2.147.483.647 eingeben müsste, da MaximumValue nicht scheint Akzeptieren Sie die Konstante Int32.MaxValue ).

Warum akzeptiert ein RangeValidator vom Typ Integer keine fehlende Eigenschaft MaximumValue , aber für einen Typ Double ist das ok?

    
Nailuj 23.03.2011, 13:42
quelle

4 Antworten

15

Die Eigenschaften MinimumValue und MaximumValue der Klasse RangeValidator geben string.Empty als Standard zurück, wenn sie nicht gesetzt sind.

Als Nächstes passiert es auch, dass die Convert() protected-Methode, die von BaseCompareValidator implementiert wird und die zum Konvertieren der Zeichenfolgeneigenschaften in Werte verwendet wird, int.Parse() für den Fall ValidationDataType.Integer aufruft. int.Parse() mag die leere Zeichenfolge nicht und löst eine Ausnahme aus.

Aber im Fall von ValidationDataType.Double ruft Convert() zuerst eine andere geschützte Methode auf, ConvertDouble() (anstelle von double.Parse() ), und in dieser Methode gibt explizit einen Zeichenfolgenwert von "0" zurück wenn eine leere Zeichenfolge erkannt wird und dieser Zeichenfolgenwert "0" später analysiert, über double.Parse() in 0d .

Der Integer-Fall profitiert nicht von einer solchen Abbildung von string.Empty auf "0".

Daher die Diskrepanz. Der Teufel steckt in den Details und Reflector ist dein Freund.

    
Chris W. Rea 23.03.2011, 13:54
quelle
1

Wenn Sie den Wert von MaximumValue auf Type="Double" belassen, entspricht dies dem Festlegen von MaximumValue auf 0. Ich bin nicht sicher, ob Sie recht haben, wenn das erste Ihrer Beispiele gut funktioniert.

    
matt-dot-net 23.03.2011 14:00
quelle
0

Es empfiehlt sich, MaximumValue für RangeValidator anzugeben, auch wenn Ihre Anforderungen nicht unbedingt einen anfordern. In diesem Fall verwenden Sie einfach MaxValue für Type . Der Standardwert für MaximumValue ist String.Empty .

    
Kris Ivanov 23.03.2011 13:52
quelle
0

Nur um es verwirrender zu machen ..

In meiner formview (die in einem updatepanel ist, wenn das einen Unterschied macht) habe ich ..

%Vor%

Beachten Sie, dass meine Breiten- und Längengradvalidierung im Wesentlichen die gleiche ist, mit Ausnahme von Längengrad, die einen höheren Maximalwert ermöglicht.

Beim Ausführen wird Longitude genau wie erwartet validiert - der Typ muss numerisch sein und der Wert muss zwischen 0 und 180 liegen.

Der Breitengradtyp muss numerisch sein, und der Bereich schlägt fehl, wenn der Wert negativ ist, der Maximalwert jedoch nicht aktiviert ist. Ich kann Werte in Millionen in das Textfeld eingeben und die Validierung schlägt nicht fehl.

    
user981235 16.10.2014 15:05
quelle