我有一个非常简单的 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
不接受失踪MaximumValue
属性,但对于其中一种类型Double
还行吧?
The MinimumValue
and MaximumValue
的属性RangeValidator
班级返校string.Empty
未设置时作为默认值。
接下来,还碰巧的是Convert()
受保护的方法实现BaseCompareValidator
,用于将字符串属性转换为值,调用int.Parse()
为了ValidationDataType.Integer
case. int.Parse()
不喜欢空字符串并且会抛出异常。
但是,在这种情况下ValidationDataType.Double
, Convert()
首先调用另一个受保护的方法,ConvertDouble()
(代替double.Parse()
),并且在该方法中当检测到空字符串时显式返回字符串值“0”,并且该字符串值“0”稍后解析,通过double.Parse()
into 0d
.
整数情况不会从这样的映射中受益string.Empty
to "0".
因此,出现了差异。魔鬼在于细节,而且反射器 http://reflector.red-gate.com是你的朋友。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)