Question

J'ai une page ASP.NET assez simple avec quelques champs de saisie et validateurs. Un champ acceptant un double ressemble à ceci:

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

Cela fonctionne comme prévu, et l'utilisateur doit entrer un nombre>= 0.
Mise à jour: cela ne fonctionne pas comme prévu après tout (un bogue étrange dans le projet). Voir les commentaires sur les réponses ci-dessous pour plus de détails

J'essaye ensuite la même chose pour un champ acceptant un entier:

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

Lors du chargement de la page ASP, cela me donne l'erreur suivante: La valeur «» de la propriété MaximumValue de «vdGrossTonnage» ne peut pas être convertie en type «Integer».

Je n'ai pas d'exigences de valeur maximale spécifiques dans le système, donc je voudrais simplement qu'il soit "par défaut" à Int32.MaxValue (bien que je devrais entrer 2,147,483,647, car MaximumValue ne semble pas accepter la constante Int32.MaxValue ).

Pourquoi un RangeValidator de type Integer n'acceptera pas une propriété MaximumValue manquante, mais pour l'un des types Double c'est correct?

Était-ce utile?

La solution

Les propriétés MinimumValue et MaximumValue de la classe RangeValidator renvoient string.Empty par défaut lorsqu'elles ne sont pas définies.

Ensuite, il arrive aussi que la méthode protégée Convert() implémentée par BaseCompareValidator, qui est utilisée pour convertir les propriétés de la chaîne en valeurs, appelle int.Parse() pour le cas ValidationDataType.Integer. int.Parse() n'aime pas la chaîne vide et lèvera une exception.

Mais, dans le cas de ValidationDataType.Double, Convert() appelle d'abord une autre méthode protégée, ConvertDouble() (au lieu de double.Parse()), et dans cette méthode, il renvoie explicitement une valeur de chaîne de "0" lorsqu'une chaîne vide est détectée , et cette valeur de chaîne "0" analyse plus tard, via double.Parse(), en 0d.

Le cas des nombres entiers ne bénéficie pas d'un tel mappage de string.Empty sur "0".

D'où la différence. Le diable est dans les détails, et Reflector est votre ami.

Autres conseils

Laisser la valeur MaximumValue vide sur Type="Double" équivaut à définir MaximumValue sur 0. Je ne suis pas sûr que vous ayez raison sur le premier de vos exemples fonctionnant correctement.

Il est préférable de spécifier MaximumValue pour le RangeValidator même si vos exigences n'en demandent pas spécifiquement un.Dans ce cas, utilisez simplement le MaxValue pour le Type.La valeur par défaut de MaximumValue est String.Empty.

Juste pour rendre les choses plus déroutantes ..

Dans mon formulaire (qui est dans un panneau de mise à jour si cela fait une différence), j'ai ..

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

Notez que ma validation de latitude et de longitude est essentiellement la même sauf que la longitude autorise une valeur maximale plus élevée.

Lors de l'exécution, la longitude est validée exactement comme prévu - le type doit être numérique et la valeur doit être comprise entre 0 et 180.

Le type de latitude doit être numérique et la plage échoue si la valeur est négative, mais que la valeur max n'est pas vérifiée.Je peux mettre des valeurs dans les millions dans la zone de texte et la validation n'échoue pas.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top