ASP.NET RangeValidator Wiraness con MaximumValue
-
29-10-2019 - |
Domanda
Ho una pagina ASP.NET piuttosto semplice con alcuni campi di input e validatori. Un campo che accetta un doppio sembra questo:
<asp:TextBox ID="tbHeight" runat="server" />
<asp:RangeValidator ID="vdHeight" runat="server"
ErrorMessage="Height must be a positive number" Text="*"
ControlToValidate="tbHeight" MinimumValue="0" Type="Double" />
Funziona come previsto e l'utente deve inserire un numero> = 0.
AGGIORNAMENTO: questo non funziona come previsto dopotutto (qualche strano bug nel progetto). Vedi i commenti alle risposte seguenti per i dettagli
Quindi provo lo stesso per un campo che accetta un numero intero:
<asp:TextBox ID="tbGrossTonnage" runat="server" />
<asp:RangeValidator ID="vdGrossTonnage" runat="server"
ErrorMessage="Gross Tonnage must be a positive whole number" Text="*"
ControlToValidate="tbGrossTonnage" MinimumValue="0" Type="Integer" />
Quando si carica la pagina ASP, questo mi dà il seguente errore: Il valore '' della proprietà massima di "vdgrosstonnage" non può essere convertito in "intero".
Non ho requisiti di valore massimo specifici nel sistema, quindi vorrei solo "default" a Int32.MaxValue
(Anche se dovrei entrare 2.147.483.647, da allora MaximumValue
non sembra accettare il Int32.MaxValue
costante).
Perché a un RangeValidator
del tipo Integer
non accetterà una scomparsa MaximumValue
proprietà, ma per uno di un tipo Double
Questo va bene?
Soluzione
Il MinimumValue
e MaximumValue
Proprietà del RangeValidator
RITORNO CLASSE string.Empty
come il loro impostazione predefinita quando non è impostato.
Successivamente, succede anche che il Convert()
Metodo protetto implementato da BaseCompareValidator
, che viene utilizzato per convertire le proprietà della stringa in valori, chiamate int.Parse()
per il ValidationDataType.Integer
Astuccio. int.Parse()
Non piace la corda vuota e lancerà un'eccezione.
Ma, nel caso di ValidationDataType.Double
, Convert()
prima chiama un altro metodo protetto, ConvertDouble()
(invece di double.Parse()
), e in quel metodo restituisce esplicitamente un valore di stringa di "0" quando viene rilevata una stringa vuota, e quel valore di stringa "0" analizzati, tramite double.Parse()
in 0d
.
Il caso intero non beneficia di tale mappatura di string.Empty
a "0".
Quindi, la dicrepancy. Il diavolo è nei dettagli e Riflettore È tuo amico.
Altri suggerimenti
Lasciare il massimo valore vuoto su type = "doppio" equivale a impostare il massimo valore su 0. Non sono sicuro di avere ragione sul primo dei tuoi esempi che funzionano bene.
È la migliore pratica specificare MaximumValue
per il RangeValidator
Anche se i tuoi requisiti non richiedono specificamente uno. In tal caso usa solo il MaxValue
per il Type
. Il valore predefinito per MaximumValue
è String.Empty
.
Solo per renderlo più confuso ..
Nel mio FormView (che si trova in un updatepanel se questo fa qualche differenza) ho ..
<div class="Width100PercentPadded">
<div class="Width40PercentPadded FloatLeft ClearLeft">
Latitude:
</div>
<div class="Width60PercentPadded FloatLeft">
<asp:TextBox runat="server" ID="txtLatitude" CssClass="Width100Percent" Text='<%# Bind("Latitude") %>' ></asp:TextBox>
<asp:CompareValidator ID="CompareValidatorLatitude" runat="server" ControlToValidate="txtLatitude" Operator="DataTypeCheck" Type="Double" ErrorMessage="Latitude must be numeric" Text="must be numeric" ForeColor="Red" Display="Dynamic"></asp:CompareValidator>
<asp:RangeValidator ID="RangeValidatorLatitude" runat="server" ControlToValidate="txtLatitude" MinimumValue="0" MaximumValue="90" ErrorMessage="Latitude in range 0 to 90" Text="range 0 to 90" ForeColor="Red" Display="Dynamic"></asp:RangeValidator>
</div>
</div>
<div class="Width100PercentPadded">
<div class="Width40PercentPadded FloatLeft ClearLeft">
Longitude:
</div>
<div class="Width60PercentPadded FloatLeft">
<asp:TextBox runat="server" ID="txtLongitude" CssClass="Width100Percent" Text='<%# Bind("Longitude") %>'></asp:TextBox>
<asp:CompareValidator ID="CompareValidatorLongitude" runat="server" ControlToValidate="txtLongitude" Operator="DataTypeCheck" Type="Double" ErrorMessage="Longitude must be numeric" Text="must be numeric" ForeColor="Red" Display="Dynamic"></asp:CompareValidator>
<asp:RangeValidator ID="RangeValidatorLongitude" runat="server" ControlToValidate="txtLongitude" MinimumValue="0" MaximumValue="180" ErrorMessage="Longitude in range 0 to 180" Text="range 0 to 180" ForeColor="Red" Display="Dynamic"></asp:RangeValidator>
</div>
</div>
Nota che la mia convalida di latitudine e longitudine è essenzialmente la stessa tranne che la longitudine consente un massimo più elevato.
Quando si esegue, la longitudine viene convalidata esattamente come previsto, il tipo deve essere numerico e il valore deve essere compreso tra 0 e 180.
Il tipo di latitudine deve essere numerico e l'intervallo fallisce se il valore è negativo, ma il maxValue non viene controllato. Posso inserire valori in milioni nella casella di testo e la convalida non fallisce.