Activerecord ValidateRegExp客户端与服务器端问题

Activerecord ValidateRegExp客户端与服务器端问题,activerecord,jquery-validate,castle-monorail,Activerecord,Jquery Validate,Castle Monorail,我正在使用monorail、activerecord和jquery。我有一张带有邮政编码文本框的表格。我在我的活动记录类中有与表格关联的: [Property] [ValidateNonEmpty] [ValidateRegExp(@"/^\d{5}(-\d{4})?$/", "Invalid")] public string ZipCode { get; set; } 如您所见,我正在使用ValidateRegExp属性,该属性随后自动生成jQ

我正在使用monorail、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编写到您的页面的页面上包含您看到的JS错误(如果有)和实际生成的JS代码,以及您正在使用的Monorail版本会有所帮助

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

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

这表明使用的是
新的RegExp(expression)
,而不是
/expression/
格式。
有了这一点,很明显Monorail的jquery验证程序集成还可以。

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

“user.username:{required:true,regExp:^[\w]{4,50}$}

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


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

如果您指定您正在使用的Monorail版本,以及您正在使用的jQuery和jQuery.validator的版本,这将非常有用
           "function(value, element, param) { return new RegExp(param).test(value); }"