我已经Range(decimal, decimal,...)
在模型中申请了我的财产。它不验证.99
,但验证0.99
。
如何让前导零?
我已经Range(decimal, decimal,...)
在模型中申请了我的财产。它不验证.99
,但验证0.99
。
如何让前导零?
这是 ASP.NET MVC 3 默认附带的数字正则表达式jquery.validate.js
和jquery.validate.min.js
文件中的一个错误。
这是来自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);
}
此函数针对数字正则表达式执行字符串测试。要修复它,请将正则表达式替换为以下内容:/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/
.
这是一个简短的版本。现在解释一下:
错误的正^-?(?:\d+|\d{1,3}(?:,\d{3})+)(?:\.\d+)?$
则表达式读取为:
^-?
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})+)
检查第一组并且验证失败,因为必须匹配第一组。
如果我们将参考http://docs.jquery.com/Plugins/Validation/Methods/number演示并检查他们的正则表达式以进行数字验证,它将如下所示^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$
:这与 buggy one 相同,但现在第一个匹配组应该是zero or one repetitions
或可选的。正则表达式中的这个附加?
修复了错误。
编辑:这也适用于 MVC 4 默认模板。两个模板都使用 1.9.0 版本的插件。在 1.10.0 版本中,此问题已修复。从变更日志:
所以有时保持更新是个好主意。