【问题标题】:How can I create a RangeValidator for Int64? BigInt? Long?如何为 Int64 创建 RangeValidator?大整数?长的?
【发布时间】:2016-04-14 23:10:24
【问题描述】:

所以我尝试使用 RangeValidator 来确保 Int64 的最小值和最大值得到验证。但是,我似乎拥有的唯一或最接近的选择是 Double。

Dim Range As New RangeValidator
Range.ControlToValidate = "..."
Range.Type = ValidationDataType.Double
Range.MinValue = Int64.MinValue.ToString
Range.MaxValue = Int64.MaxValue.ToString

我不想使用自定义验证器。我想我可以使用一些疯狂的正则表达式..但只是想了解为什么我不能这样做。

例如 Int64 的最大值为:

9223372036854775807

但这验证了:

9223372036854775808
9223372036854775810
9223372036854775899

如果我跳一个更大的数字,它不会验证:

9223372036854799999

我假设这是由于 Double 发生了一些转换。

我确实看到 System.Configuration 中有一个 LongValidator,但我试图尽可能避免创建 CustomValidator 类型,并且它是不同的验证类型,因为它不适合像 RangeValidator 那样使用。

所有这些都是为了学习目的而不是其他任何事情。我知道我可以跳过其他障碍,但希望能看得更清楚。

也标记了 C#。忽略我的 vb.net 示例..根据问题并不重要。将转换任何代码。

【问题讨论】:

  • 可能和using-asp-net-rangevalidator-for-int64同一个问题?
  • @Sam 看到了那个,只是我认为他们实际上并没有遇到我遇到的问题。他们最终使用了正则表达式和范围,但 Double 类型仍然存在问题。
  • :) 很公平,恐怕我对它的验证原因不够了解,但我假设你在使用 double 类型时走在正确的轨道上..
  • @Sam 快把我逼疯了。我只是希望微软能在验证器中添加更多的数据类型。 :)

标签: c# asp.net vb.net validation


【解决方案1】:

我在forum by PLBlum 上找到了一个合理的答案

我想澄清一些事情。 RangeValidator 不使用 正则表达式来验证双精度。它使用正则表达式 从字符串中提取数字和十进制字符。那么它 使用 javascript 将结果转换为实际数字 parseFloat() 函数。如果该函数无法转换,则 RangeValidator 知道该值不被 javascript 接受。

我怀疑问题在于您分配的值 对于 javascript 的浮点,MaximumValue 太大。我认为 .net 的 Double 和 javascript 都是 80 位浮点数,但它的 可能它们在最小和最大范围内略有不同。在任何 情况下,我建议您像这样更改您的代码:

  • 使用 CompareValidator,Operator=DataTypeCheck,Type=Double。由于格式或对于 80 位来说太大,它将报告一个非法值 号码。

  • 使用另一个 CompareValidator,Operator=GreaterThanEqual,Type=Double,ValueToCompare= 你的最小 double。这将报告一个 如果有任何东西低于最小值,则会出错。最大值在 其他验证器。

也许这可以解释为什么它验证不正确。

【讨论】:

  • 有趣的方法,非常感谢您帮助我进行研究。我认为问题仍然存在,因为我不想允许小数位,而您建议的解决方法正是这样做的。我总是可以使用自定义验证器......我只是对为什么没有其他方法感到困惑。再次感谢@Sam。
  • 知道什么...这引发了一个想法。想试试看。
  • 没有没有用。禁用了客户端验证,它仍然失败,所以回到双重问题。
  • 在这一点上,我真的会选择自定义解决方案,在我看来,即使有一种标准化的方式,它显然没有很好的文档记录,浪费了更多的时间来研究它而不是自己编写它并移动on.. :) 我们毕竟是程序员,对吧? :D
  • 我使用了正则表达式。我在构建它后最终偏头痛,但它有效。无论如何,所有这些都更多地用于研究/学习,我非常感谢您的帮助和想法。
【解决方案2】:

除非其他人想插话,否则实际上我发现了一种方法可以做到这一点,那就是使用自定义验证器。 System.configuration 中有一个函数可以检查一个值是否为有效的“Long”。问题是,如果您想要客户端验证,似乎唯一有效的选择是使用正则表达式。否则,这个数字太大了,JavaScript 将它解析为一个浮点数,正如 Sam 提到的那样。

所以,我最终使用正则表达式来获得客户端和服务器端验证。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-27
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多