2011-03-23 13 views
8

Ho una pagina ASP.NET piuttosto semplice con alcuni campi di input e validatori. Un campo accettando una doppia simile a questa:ASP.NET RangeValidator stranezza con MaximumValue

<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" /> 

Questo funziona come previsto, e l'utente deve inserire un numero> = 0.
Update: questo non funziona come previsto dopotutto (qualche strano bug nel progetto). Vedere i commenti alle risposte sotto per i dettagli

Allora provo lo stesso per un campo di accettare 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 l'ASP-page, questo mi dà il seguente errore: Il valore ' 'della proprietà MaximumValue di' vdGrossTonnage 'non può essere convertito in tipo' Integer '.

non ho alcun requisito specifico valore massimo nel sistema, quindi vorrei solo per "default" per Int32.MaxValue (anche se avrei dovuto entrare 2,147,483,647, dal momento che MaximumValue non sembra accettare la Int32.MaxValue costante).

Perché è che un RangeValidator del tipo Integer non accetterà una MaximumValue proprietà mancante, ma per una di tipo Double questo è ok?

risposta

15

I MinimumValue e MaximumValue proprietà del ritorno RangeValidator classe string.Empty come il loro default quando non impostate.

successivo, accade anche che il metodo protetto Convert() implementato da BaseCompareValidator, che viene utilizzato per convertire le proprietà di stringa di valori, richiede int.Parse() per il caso ValidationDataType.Integer. int.Parse() non piace la stringa vuota e genererà un'eccezione.

Ma, nel caso di ValidationDataType.Double, Convert() primi inviti altro metodo protetto, ConvertDouble() (anziché double.Parse()), e dal fatto che il metodo è restituisce esplicitamente un valore stringa "0" quando viene rilevata una stringa vuota, e quel valore di stringa "0" analizza in seguito, tramite double.Parse() in 0d.

Il caso intero non beneficia di tale mappatura di string.Empty su "0".

Quindi, la diceria. Il diavolo è nei dettagli e Reflector è tuo amico.

+0

Solo un piccolo follow-up: nel caso in cui tralascio 'MaximumValue' per il doppio tipo, questo significherebbe davvero che sia il minimo che il massimo sono 0. Perché allora la mia pagina convalida correttamente il campo (-1 non è valido e 1 è valido (ho ricontrollato e funziona davvero))? – Nailuj

+0

@Nailuj Non posso confermare la tua scoperta che la pagina si convalida correttamente con "1" come input. Se rilascio i controlli (dal primo frammento sopra) su una nuova pagina in un progetto di sito Web vuoto, inserendo "1" e quindi causando il postback (ho aggiunto un pulsante) * fa * causa un errore di convalida. –

+0

Non convalida correttamente. –

0

È consigliabile specificare MaximumValue per RangeValidator anche se i requisiti non richiedono specificamente uno. In tal caso, utilizzare lo MaxValue per Type. Il valore predefinito per MaximumValue è String.Empty.

1

Lasciando il MaximumValue vuoto su Type = "Double" equivale a impostare MaximumValue su 0. Non sono sicuro che tu abbia ragione sul primo degli esempi che funziona correttamente.

+0

Sì, io * sono * sicuro mio il primo esempio funziona bene. L'ho ricontrollato (vedi il mio commento alla risposta di Chris W. Rea). – Nailuj

+0

@Nailuj Ho provato il tuo esempio e non ha funzionato bene. (Vedi il mio commento sopra.) Puoi riprovare nel caso più semplice possibile, al di fuori dell'applicazione, in un nuovo progetto di sito web, come ho fatto io? Forse c'è altro codice dalla tua applicazione che interferisce. per esempio. Abilita/disabilita selettivamente i tuoi validatori? ecc. –

+0

@Chris W. Rea: Ho provato con un nuovo progetto ASP.NET, e in questo caso ho ottenuto lo stesso risultato: la validazione * non * funziona correttamente. Non riesco a pensare a nulla di ovvio nella mia altra applicazione che potrebbe causare questo ... Ma non importa, mi limiterò a specificare in modo esplicito sia il valore minimo che il valore massimo. Grazie per averci dedicato del tempo per testarlo :) – Nailuj

0

Solo per rendere più confuso ..

Nel mio formview (che si trova in un UpdatePanel se che fa alcuna 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 mia latitudine e longitudine di convalida è essenzialmente lo stesso, tranne Longitudine permette un maxvalue superiore.

Quando si esegue, Longitudine viene convalidato esattamente come previsto - tipo deve essere numerico e valore deve essere compreso tra 0 e 180.

tipo latitudine deve essere numerico, e gamma fallisce se il valore è negativo, ma non è maxvalue controllato. Posso mettere i valori in milioni nella casella di testo e la convalida non fallisce.