范围数据注释属性不验证.99?

时间:2012-08-13 17:16:46

标签: .net asp.net-mvc-3 range data-annotations

我已将Range(decimal, decimal,...)应用于我的模型中的属性。它不会验证.99,但会验证0.99

如何让领先的零?

1 个答案:

答案 0 :(得分:1)

这是jquery.validate.jsjquery.validate.min.js文件中的数字regexp中的一个错误,默认情况下是ASP.NET MVC 3。

以下是来自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})+),然后验证失败,因为第一个组必须< / em>匹配。

如果我们要参加http://docs.jquery.com/Plugins/Validation/Methods/number演示并检查其正则表达式以进行数字验证,它将如下所示:^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$。这与错误的一个相同,但现在第一个匹配的组应该是zero or one repetitions可选。正则表达式中的这个额外的?修复了错误。

编辑:这也适用于MVC 4默认模板。两个模板都使用1.9.0版本的插件。在版本1.10.0中,此问题已得到修复。来自changelog

  • 修正了没有前导零的小数的正则表达式问题。添加了新方法测试。修复#41

所以有时保持更新是一个好主意。