使用MaximumValue的ASP.NET RangeValidator怪异

Jul*_*ian 9 asp.net validation rangevalidator

我有一个非常简单的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" />
Run Code Online (Sandbox Code Playgroud)

这按预期工作,用户必须输入一个数字> = 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" />
Run Code Online (Sandbox Code Playgroud)

加载ASP页面时,会出现以下错误:'vdGrossTonnage'的MaximumValue属性值''无法转换为'Integer'类型.

我在系统中没有任何特定的最大值要求,所以我只想"默认" Int32.MaxValue(虽然我必须输入2,147,483,647,因为MaximumValue似乎不接受Int32.MaxValue常量).

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

Chr*_*Rea 15

MinimumValueMaximumValue该属性RangeValidator类的回报string.Empty作为其默认时未设置.

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

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

整数情况不会受益于这种string.Empty到"0" 的映射.

因此,这种双重性.魔鬼在细节中,而Reflector是你的朋友.