Sco*_*ker 21 regex client-side-validation asp.net-mvc-2
我有一个用于客户端验证的字符串:
private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";
Run Code Online (Sandbox Code Playgroud)
我在我的[RegularExpression(regex, ErrorMessage = "invalid")]属性中使用此字符串.
我知道/iJavascript正则表达式的标志用于使其不区分大小写,但只是将其添加到我的正则表达式的末尾(即@"^....$/i"不工作 - 正则表达式验证完全失败,无论输入什么(有效或无效) ).
我错过了什么?
Jer*_*ook 35
我创建了这个属性,允许您指定RegexOptions.编辑:它还集成了不显眼的验证.客户端只服从RegexOptions.Multiline和RegexOptions.IgnoreCase,因为这是JavaScript支持的.
[RegularExpressionWithOptions(@".+@example\.com", RegexOptions = RegexOptions.IgnoreCase)]
Run Code Online (Sandbox Code Playgroud)
C#
public class RegularExpressionWithOptionsAttribute : RegularExpressionAttribute, IClientValidatable
{
public RegularExpressionWithOptionsAttribute(string pattern) : base(pattern) { }
public RegexOptions RegexOptions { get; set; }
public override bool IsValid(object value)
{
if (string.IsNullOrEmpty(value as string))
return true;
return Regex.IsMatch(value as string, "^" + Pattern + "$", RegexOptions);
}
public IEnumerable<System.Web.Mvc.ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var rule = new ModelClientValidationRule
{
ErrorMessage = FormatErrorMessage(metadata.DisplayName),
ValidationType = "regexwithoptions"
};
rule.ValidationParameters["pattern"] = Pattern;
string flags = "";
if ((RegexOptions & RegexOptions.Multiline) == RegexOptions.Multiline)
flags += "m";
if ((RegexOptions & RegexOptions.IgnoreCase) == RegexOptions.IgnoreCase)
flags += "i";
rule.ValidationParameters["flags"] = flags;
yield return rule;
}
}
Run Code Online (Sandbox Code Playgroud)
JavaScript的
(function ($) {
$.validator.unobtrusive.adapters.add("regexwithoptions", ["pattern", "flags"], function (options) {
options.messages['regexwithoptions'] = options.message;
options.rules['regexwithoptions'] = options.params;
});
$.validator.addMethod("regexwithoptions", function (value, element, params) {
var match;
if (this.optional(element)) {
return true;
}
var reg = new RegExp(params.pattern, params.flags);
match = reg.exec(value);
return (match && (match.index === 0) && (match[0].length === value.length));
});
})(jQuery);
Run Code Online (Sandbox Code Playgroud)
安东尼史蒂文斯的这篇文章帮助我完成了这项工作:ASP.NET MVC 3使用自定义验证器进行不显眼的Javascript验证
Ahm*_*eed 17
在C#中,您可以内联一些正则表达式选项.要指定忽略大小写的选项,您将添加(?i)到模式的开头.但是,我不确定如何处理RegularExpressionAttribute它以及它是否处理客户端的翻译.根据我对ASP.NET的经验,RegularExpressionValidator我对此表示怀疑; 正则表达式应该足够香草,适用于两个引擎.
在任何情况下,如果它是有效的,它将如下所示:
@"^(?i)(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$"
Run Code Online (Sandbox Code Playgroud)
private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([a-zA-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";
Run Code Online (Sandbox Code Playgroud)