10

我有一个非常简单的 ASP.NET 页面,其中包含一些输入字段和验证器。一个接受双精度的字段如下所示:

<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,因为MaximumValue似乎不接受这个Int32.MaxValue常数)。

为什么RangeValidator类型Integer的 a 不接受缺少的MaximumValue属性,但是对于其中一种类型,Double这是可以的?

4

4 回答 4

15

类的MinimumValueMaximumValue属性在未设置时RangeValidator返回string.Empty为其默认值。

接下来,也会发生Convert()由 实现的受保护方法BaseCompareValidator(用于将字符串属性转换为值)调用int.Parse()这种ValidationDataType.Integer情况。 int.Parse()不喜欢空字符串,会抛出异常。

但是,在 的情况下ValidationDataType.DoubleConvert()首先调用另一个受保护的方法ConvertDouble()(而不是double.Parse()),并且在该方法中,当检测到空字符串时,它显式返回字符串值“0”,然后通过解析该字符串值“0”double.Parse()进入0d.

整数情况不会从这种string.Empty到“0”的映射中受益。

因此,差异。魔鬼在细节中,Reflector是你的朋友。

于 2011-03-23T13:54:12.723 回答
1

将 Type="Double" 上的 MaximumValue 留空相当于将 MaximumValue 设置为 0。我不确定您对第一个示例是否正常工作是否正确。

于 2011-03-23T14:00:55.687 回答
0

即使您的要求没有特别要求,MaximumValue最好指定一个。RangeValidator在这种情况下,只需使用MaxValuefor TypeMaximumValue的默认值为String.Empty

于 2011-03-23T13:52:10.133 回答
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 回答