【问题标题】:ValidateRegExp client-side vs server-side issueValidateRegExp 客户端与服务器端问题
【发布时间】:2010-08-12 01:13:45
【问题描述】:

我正在使用单轨、activerecord 和 jquery。我有一个带有邮政编码文本框的表格。我在与表单关联的活动记录类中有:

[Property]
        [ValidateNonEmpty]
        [ValidateRegExp(@"/^\d{5}(-\d{4})?$/", "Invalid")]
        public string ZipCode { get; set; }

如您所见,我正在使用 ValidateRegExp 属性,然后自动生成 jQuery 验证规则。问题是 javascript 中的正则表达式与 C# 中的正则表达式不同。 Javascript 在正则表达式之前和之后需要 /,而 C# 不需要。如果我放斜线,那么 jQuery 验证将起作用,但如果他们绕过 javascript 验证并提交禁用 js 的表单(或者如果有人通过其他方式(如测试用例)保存对象),那么它会说邮政编码是无效,因为 C# 不喜欢斜线。

所以我的问题是,您如何使用一个正则表达式同时满足 javascript 和 C# 的需求?我希望它足够聪明,可以在 jQuery 验证之前和之后添加斜杠,这样您就可以在 C# 中指定没有斜杠的正则表达式,但事实并非如此。

【问题讨论】:

  • 如果您指定您正在使用的 Monorail 版本以及您正在使用的 jQuery 和 jquery.validator 版本,将会很有帮助

标签: activerecord jquery-validate castle-monorail


【解决方案1】:

您应该指定正则表达式本身,而不是周围的/ 字符。

如果您在客户端遇到问题,如果您将看到的 JS 错误(如果有)包括在由 Monorail 写入您的页面的页面上实际生成的 JS 代码,将会有所帮助,以及您正在使用的 Monorail 版本。

作为旁注,让我们看一下从JQueryValidator.cs 中的验证属性生成 JS 验证规则的代码

相关部分位于第 378 行(截至代码库的当前版本):

           "function(value, element, param) { return new RegExp(param).test(value); }" 

这表明使用了new RegExp(expression),而不是/expression/ 格式。 有了这个 - 很明显,Monorail 的 jquery 验证器集成是可以的。

【讨论】:

    【解决方案2】:

    我正在使用 jQuery 1.4.2。不确定我使用的是什么版本的 MonoRail,Castle.MonoRail.Framework dll 说 v2.0.0.0。我在过去 3 个月内更新了它,所以它是相当新的。您显示的 js 表明您的版本比我更新,因为它为我生成以下内容(如果 ValidateRegExp 表达式中不包含斜杠):

    "user.username":{ 必需:true ,正则表达式:^[\w ]{4,50}$ }

    这显然会在 js 中产生语法错误,因为它没有用引号或斜杠包裹。我最终创建了一个新的 RegExp 验证器,以 AbstractValidator 作为基类来解决我的 MonoRail 版本中的错误。

    您知道这是否是过去几个月解决的问题吗?否则我无法解释你的如何在 js 中生成新的 RegExp 而我的没有......

    【讨论】:

      猜你喜欢
      • 2011-05-26
      • 2016-03-30
      • 2011-06-06
      • 2011-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多