我有一个非常简单的 ASP.NET 页面,其中包含一些输入字段和验证器。接受 double 值的一个字段如下所示:
<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
不接受缺失的MaximumValue
属性,但针对 Double
类型之一这样可以吗?
最佳答案
RangeValidator
类的 MinimumValue
和 MaximumValue
属性在未设置时返回 string.Empty
作为默认值.
接下来,BaseCompareValidator
实现的 Convert()
protected 方法(用于将字符串属性转换为值)也调用了 int。 Parse()
适用于 ValidationDataType.Integer
情况。 int.Parse()
不喜欢空字符串,会抛出异常。
但是,在 ValidationDataType.Double
的情况下,Convert()
首先调用另一个 protected 方法 ConvertDouble()
(而不是 double.Parse()
),并且在该方法中,当检测到空字符串时,它显式返回字符串值“0”,并且稍后会解析该字符串值“0” ,通过 double.Parse()
转换为 0d
。
整数情况不会从 string.Empty
到“0”的映射中受益。
因此,差异。细节决定成败,Reflector是你的 friend 。
关于ASP.NET RangeValidator 与 MaximumValue 的怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5406124/