I have a string that I use for client side validation:
private const String regex = @"^(?:\b(?:\d{5}(?:\s*-\s*\d{5})?|([A-Z]{2})\d{3}(?:\s*-\s*\1\d{3})?)(?:,\s*)?)+$";
I use this string in my [RegularExpression(regex, ErrorMessage = "invalid")]
attribute.
I know that the /i
flag for a Javascript regex is used to make it case insensitive, but just tacking it on to the end of my regex (i.e. @"^....$/i"
isn't working - the regex validation fails completely, regardless of what is entered (valid or not).
What am I missing?
I created this attribute which allows you to specify RegexOptions. EDIT: It also integrates with unobtrusive validation. The client will only obey RegexOptions.Multiline and RegexOptions.IgnoreCase since that is what JavaScript supports.
[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);
This article by Anthony Stevens helped me get this working: ASP.NET MVC 3 Unobtrusive Javascript Validation With Custom Validators
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With