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

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

我已申请Range(decimal, decimal,...)到我在模型中的属性(property)。它不验证 .99 , 但验证 0.99 .

如何让前导零?

最佳答案

这是 jquery.validate.js 中数字正则表达式中的错误和 jquery.validate.min.js默认情况下随 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);
}

此函数针对数字正则表达式执行字符串测试。要修复它,请将正则表达式替换为以下表达式:/^-?(?:\d+|\d{1,3}(?:,\d{3})+)?(?:\.\d+)?$/ .

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

buggy ^-?(?:\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 版本中,此问题已修复。来自 changelog :
  • 修复了没有前导零的小数的正则表达式问题。添加了新方法测试。修复 #41

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

    关于.net - 范围数据注释属性不验证 .99?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11939127/

    相关文章:

    c# - 带有 Autofac 的 ASP.NET MVC3 Bootstrap

    c# - 如何使用IPAddress和IPv4Mask获取IP地址范围?

    ruby - 内联数组切片

    .net - System.ServiceModel.DomainServices.EntityFramework DLL 在哪里?

    .net - Linq to SQL中是否提供Unpivot(非枢轴)功能?如何?

    c# - 从 HttpClient 实例访问 HttpClientHandler?

    swift - 使用范围的子字符串

    c# - .NET 编码实践和代码维护

    asp.net-mvc - 从一个 View 重定向到另一个 View

    asp.net-mvc-3 - 在 MVC3 中发布后保护模型的最佳实践