ASP.NET RangeValidator 与 MaximumValue 的怪异

标签 asp.net validation rangevalidator

我有一个非常简单的 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 类的 MinimumValueMaximumValue 属性在未设置时返回 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/

相关文章:

c# - 在 MVC3 中捕获模型的旧值?

php - Yii 防止客户端验证表单提交

javascript - keydown 不会在移动设备上触发 Chrome

c# - 在 C# 中使用 HtmlAgilityPack 解析 html

c# - Identity - VerifyHashedPassword 方法效果不佳

asp.net-mvc - 动态设置必填字段

javascript - Jquery 验证未触发且控制台中没有错误

c# - ASP.NET MVC - 默认范围验证错误消息未被覆盖

.net - RangeValidator 无法计数?