.net 范围数据批注属性未验证。99?

.net 范围数据批注属性未验证。99?,.net,asp.net-mvc-3,range,data-annotations,.net,Asp.net Mvc 3,Range,Data Annotations,我已将范围(十进制、十进制等)应用于模型中的属性。它不验证.99,但验证0.99 如何允许前导零?这是ASP.NET MVC 3默认附带的jquery.validate.js和jquery.validate.min.js文件中数字regexp中的一个错误 以下是来自jquery.validate.js,第1048行的代码: // http://docs.jquery.com/Plugins/Validation/Methods/number number: function(value, ele

我已将
范围(十进制、十进制等)
应用于模型中的属性。它不验证
.99
,但验证
0.99


如何允许前导零?

这是ASP.NET MVC 3默认附带的
jquery.validate.js
jquery.validate.min.js
文件中数字regexp中的一个错误

以下是来自
jquery.validate.js
,第1048行的代码:

// http://docs.jquery.com/Plugins/Validation/Methods/number
number: function(value, element) {
    return this.optional(element) || /^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$/.test(value);
}
此函数针对数字正则表达式执行字符串测试。若要修复它,请将regexp替换为以下一个:
/^-(?:\d+\d{1,3}(?,\d{3}+)+)(?:\。\d+)$/

这是一个简短的版本。下面是解释:

Buggy
^-?(?:\d+\d{1,3}(?:,\d{3})+)(?:\。\d+)$
regexp的内容如下:

^-?
  Beginning of line or string
  -, zero or one repetitions
Match expression but don't capture it. [\d+|\d{1,3}(?:,\d{3})+]
  Select from 2 alternatives
      Any digit, one or more repetitions
      \d{1,3}(?:,\d{3})+
          Any digit, between 1 and 3 repetitions
          Match expression but don't capture it. [,\d{3}], one or more repetitions
              ,\d{3}
                  ,
                  Any digit, exactly 3 repetitions
Match expression but don't capture it. [\.\d+], zero or one repetitions
  \.\d+
      Literal .
      Any digit, one or more repetitions
End of line or string
如您所见,第二个捕获组
(?:\。\d+)
允许使用
.XX
格式的数字,但在匹配时,第一个组
(?:\d+\d{1,3}(?:,\d{3})+
首先被检查,验证失败,因为第一个组必须匹配

如果我们参考演示并检查它们的regexp以进行数字验证,它将如下所示:
^-(?:\d+\d{1,3}(?:,\d{3})+)(?:\。\d+)$
。这与buggy one相同,但现在第一个匹配组应该是零次或一次重复,或者换句话说是可选的。regexp中的这个额外的
修复了这个bug

编辑:这也适用于MVC4默认模板。两个模板都使用1.9.0版本的插件。在版本1.10.0中,此问题已修复。发件人:

  • 修正了不带前导零的小数的正则表达式问题。增加了新的测试方法。修复#41
所以有时候保持更新是个好主意