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?
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.
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.
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
.
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.
Tags und Links asp.net validation rangevalidator