0

我正在使用单轨、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# 中指定正则表达式,但事实并非如此。

4

2 回答 2

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 验证器集成是可以的。

于 2010-08-12T04:16:16.577 回答
0

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

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

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

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

于 2010-08-12T14:58:25.913 回答