我正在使用单轨,主动记录和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#中指定正则表达式,但事实并非如此。
答案 0 :(得分:1)
您应该指定正则表达式本身,而不包含周围的/
个字符。
如果您遇到客户端方面的问题,如果您包含您看到的JS错误(如果有的话),以及Monorail向您的页面写出的页面上实际生成的JS代码,将会有所帮助,以及你正在使用的单轨版本。
作为旁注,让我们看看JQueryValidator.cs
中验证属性生成JS验证规则的代码相关部分位于第378行(截至当前版本的代码库):
"function(value, element, param) { return new RegExp(param).test(value); }"
指出使用new RegExp(expression)
而不是/expression/
格式的事实。
有了这个 - 很明显Monorail的jquery验证器集成是可以的。
答案 1 :(得分:0)
我正在使用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而我的不会......