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?

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top