【问题标题】:Syntax difference in .NET and JavaScript causing MVC validation to fail [closed].NET 和 JavaScript 中的语法差异导致 MVC 验证失败 [关闭]
【发布时间】:2015-01-06 15:53:07
【问题描述】:

我正在尝试在我的 MVC 应用程序中使用 Data Annotation 验证,并打开了不显眼的客户端验证。

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

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

有没有办法解决这个问题?

【问题讨论】:

  • 你能发布你的正则表达式吗?
  • 什么是导致问题的正则表达式
  • 我不认为指定确切的正则表达式会有所帮助,因为这是一个普遍的问题,我需要一个通用的解决方案。 .NET 正则表达式语法和 JavaScript 正则表达式语法有很多差异,解决方案必须迎合所有这些差异,而不是适用于特定类型的正则表达式。

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


【解决方案1】:

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

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

而且……就是这样。

如果您的 .NET 正则表达式仅使用这些功能,您就可以了。但是有一个差异:.NET 使用 Unicode 属性来表示 \w \d \s 等等,而 JavaScript 使用 ASCII,所以你应该使用 [0-9] 而不是 \d 来获得完全相同的结果。

但如果您的 .NET 正则表达式使用更多功能,您将不得不为受影响的正则表达式禁用客户端时间验证,或编写自定义 JS 验证器。

【讨论】:

  • 我忘了说:IIRC,ASP.NET 隐式地锚定了你的正则表达式(即它把它放在^(?:)$ 之间)。
【解决方案2】:

ASP.NET 为 RegExp 对象添加了糖,允许命名您的组和其他内容。如果您希望相同的正则表达式在后端和前端有效,那么请考虑使用纯 JavaScript 正则表达式。这个工具可以帮助你构建你需要的正则表达式: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:)|(\\/+)");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-01-29
    • 2015-03-13
    相关资源
    最近更新 更多