RegularExpressionAttribute-如何使其对于客户端验证不区分大小写?

问题描述 投票:21回答:3

我有一个用于客户端验证的字符串:

private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";

我在[RegularExpression(regex, ErrorMessage = "invalid")]属性中使用此字符串。

[我知道Javascript正则表达式的/i标志用于使其不区分大小写,但仅将其附加到我的正则表达式的末尾(即@"^....$/i"无法正常工作-不管正则表达式验证完全失败)输入的内容(有效或无效)。

我想念的是什么?

regex asp.net-mvc-2 client-side-validation
3个回答
8
投票
private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([a-zA-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";

36
投票

我创建了此属性,使您可以指定RegexOptions。编辑:它也与不干扰验证集成。客户端将仅服从RegexOptions.Multiline和RegexOptions.IgnoreCase,因为这是JavaScript支持的。

[RegularExpressionWithOptions(@".+@example\.com", RegexOptions = RegexOptions.IgnoreCase)]

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;
    }
}

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);

[安东尼·史蒂文斯(Anthony Stevens)的这篇文章帮助我完成了这项工作:ASP.NET MVC 3 Unobtrusive Javascript Validation With Custom Validators


17
投票

在C#中,您可以内联一些正则表达式选项。要指定忽略大小写的选项,可以将(?i)添加到模式的开头。但是,我不确定RegularExpressionAttribute将如何处理它,以及它是否可以处理客户端的翻译。根据我对ASP.NET RegularExpressionValidator的经验,我对此表示怀疑。 regex应该足够用于两个引擎。无论如何都有效,它看起来像这样:

@"^(?i)(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$"

© www.soinside.com 2019 - 2024. All rights reserved.