.NET和JavaScript中的语法差异导致MVC验证失败

时间:2014-11-10 10:57:29

标签: javascript jquery regex asp.net-mvc validation

我正在尝试在我的MVC应用程序中使用数据注释验证,并启用了不引人注意的客户端验证。

然而,问题在于.NET和JavaScript的Regex语法不同。因此,如果我使用符合.NET语法的正则表达式在我的模型属性上使用正则表达式验证注释,则相同的正则表达式字符串将被转移到data-val-regex属性中的客户端,并用于使用客户端验证的JavaScript。

因此,我最终使用.NET样式的正则表达式来验证使用JavaScript。这导致验证在客户端和服务器端的行为方式不同。

有解决方法吗?

2 个答案:

答案 0 :(得分:2)

简而言之,JavaScript正则表达式。很弱。
您可以比较this site(和链接页面)上的所有差异,但基本上只限于:

  • 基本结构:. | [] [^] [x-y] () (?:)
  • 简单量词:+ * ? {n,} {n,m}
  • 懒惰量词:*? +? ?? {n,}? {n,m}?
  • \w \d \s等的ASCII范围
  • 主播:^ $ \b
  • 编号后退:\1(没有命名组)
  • lookaheads:(?=) (?!)(对不起,根本没有看守)
  • 唯一的Unicode 功能\uXXXX(无Unicode属性)
  • 修饰符:g i m y(无s - 使用[\s\S]作为解决方法)

并且......就是这样。

如果你的.NET正则表达式只使用这些功能,你会没事的。但有一个例外:.NET使用\w \d \s的Unicode属性,等等,而JavaScript使用ASCII,所以你应该使用[0-9]而不是\d来获得完全相同的结果。< / p>

但是如果您的.NET正则表达式使用更多功能,则必须为受影响的正则表达式禁用客户端时间验证,或者编写自定义JS验证程序。

答案 1 :(得分:0)

ASP.NET为RegExp对象添加了糖,允许命名您的组和其他东西。如果您希望相同的正则表达式在后端和前端有效,那么请考虑使用纯JavaScript regexp。此工具可以帮助您构建所需的正则表达式: http://www.regexr.com/ 在ASP.Net中,您需要转义反斜杠字符,或使用"@"指定文字字符串。即。

//using string literal notation
var re1 = new System.Text.RegularExpressions.Regex(@"^(http:)|(\/+)");

//or escaping the backslash
var re2 = new System.Text.RegularExpressions.Regex("^(http:)|(\\/+)");