10

いくつかの入力フィールドとバリデーターを備えた非常に単純な ASP.NET ページがあります。double を受け入れる 1 つのフィールドは次のようになります。

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

これは期待どおりに機能し、ユーザーは数値 >= 0 を入力する必要があり
ます。更新: これは結局期待どおりに機能しません (プロジェクトの奇妙なバグ)。詳細については、以下の回答へのコメントを参照してください

次に、整数を受け入れるフィールドに対して同じことを試みます。

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

ASP ページをロードすると、次のエラーが表示されます。「vdGrossTonnage」の MaximumValue プロパティの値は「Integer」型に変換できません。

システムには特定の最大値要件がないので、「デフォルト」にしたいだけです(ただし、定数を受け入れないように見えるためInt32.MaxValue、2,147,483,647を入力する必要があります)。MaximumValueInt32.MaxValue

RangeValidatorタイプの が欠落しているプロパティIntegerを受け入れないのはなぜですか?MaximumValueDouble

4

4 に答える 4

15

クラスのMinimumValueandMaximumValueプロパティは、設定されていない場合、デフォルトとして返されます。RangeValidatorstring.Empty

次に、文字列プロパティを値に変換するために使用される、Convert()によって実装された保護されたメソッドがケースを呼び出すことも発生します。 空の文字列が気に入らないため、例外がスローされます。BaseCompareValidatorint.Parse()ValidationDataType.Integerint.Parse()

ただし、の場合ValidationDataType.Double、最初に(の代わりに)Convert()別の保護されたメソッドを呼び出し、そのメソッドでは、空の文字列が検出されたときに明示的に「0」の文字列値を返し、その文字列値「0」は後で解析します。に。ConvertDouble()double.Parse()double.Parse()0d

string.Empty整数の場合は、このような「0」へのマッピングの恩恵を受けません。

したがって、矛盾。悪魔は細部に宿り、リフレクターはあなたの友達です。

于 2011-03-23T13:54:12.723 に答える
1

Type="Double" で MaximumValue を空白のままにすることは、MaximumValue を 0 に設定することと同じです。最初の例が正常に機能していることについて、あなたが正しいかどうかはわかりません。

于 2011-03-23T14:00:55.687 に答える
0

混乱を招くだけです..

私のフォームビュー(それが違いを生む場合は更新パネルにあります)で..

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

私の緯度と経度の検証は、経度がより高い最大値を許可することを除いて、本質的に同じであることに注意してください。

実行すると、経度は期待どおりに正確に検証されます。型は数値でなければならず、値は 0 から 180 の間でなければなりません。

緯度のタイプは数値でなければなりません。値が負の場合、範囲は失敗しますが、最大値はチェックされません。テキストボックスに数百万の値を入力でき、検証は失敗しません。

于 2014-10-16T15:05:50.207 に答える
0

要件で特に要求されていない場合でも、を指定することMaximumValueをお勧めします。RangeValidatorその場合は、 に を使用しMaxValueTypeください。のデフォルト値はMaximumValueですString.Empty

于 2011-03-23T13:52:10.133 に答える