2010-11-18 3 views
19

Ich habe eine Zeichenfolge, die ich für die Client-seitige Validierung verwenden:RegularExpressionAttribute - Wie wird die clientseitige Validierung nicht von Groß- und Kleinschreibung unterschieden?

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

Ich benutze diese Zeichenfolge in meinem [RegularExpression(regex, ErrorMessage = "invalid")] Attribute.

Ich weiß, dass die /i Flag für eine Javascript regex verwendet wird, um es Groß- und Kleinschreibung, aber Anheften es nur auf das Ende meiner regex (dh @"^....$/i" nicht funktioniert - die Regex Validierung komplett fehlschlug, unabhängig davon, was ist (gültig oder nicht) eingetragen.

Was bin ich?

Antwort

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

ah! Na sicher! ausgezeichnete Antwort - allerdings muss ich fragen: Gibt es eine Möglichkeit, die Groß- und Kleinschreibung zu ignorieren? –

+1

Regex re = neue Regex (@ "^ (?: \ B (?: \ D {5} (?: \ S * - \ s * \ d {5})? | ([A-zA-Z] { 2}) \ d {3} (?: \ S * - \ s * \ 1 \ d {3})?) (?:, \ S *)?) + $ ", RegexOptions.IgnoreCase); // Das ist C# -Code. –

+0

die Frage bezieht sich auf RegularExpressionAttribute und dort müssen Sie nur Zeichenfolge übergeben. Daher können Sie die Regex-Klasse nicht mit Attributen verwenden –

15

In C# einige regex Optionen Inline können. um die Option angeben Fall ignorieren Sie (?i) zu Beginn Ihres Muster hinzufügen würde Ich bin mir jedoch nicht sicher, wie dies von derbehandelt werden würdeund wenn es die Übersetzung für die Client-Seite behandelt. Aus meiner Erfahrung mit ASP.NET RegularExpressionValidator bezweifle ich es; die Regex sollte Vanille genug sein, um für beide Motoren zu arbeiten. In jedem Fall

wenn es gültig ist es so aussehen würde:

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

Es funktioniert für mindestens ASP.NET MVC 2. Aber nur serverseitig. –

29

Ich habe dieses Attribut, das Sie RegexOptions angeben kann. EDIT: Es integriert sich auch mit unauffälliger Validierung. Der Client wird RegexOptions.Multiline und RegexOptions.IgnoreCase nur befolgen, da dies von JavaScript unterstützt wird.

[RegularExpressionWithOptions(@"[email protected]\.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); 

Dieser Artikel von Anthony Stevens hat mir geholfen, diese Arbeit zu erhalten: ASP.NET MVC 3 Unobtrusive Javascript Validation With Custom Validators

+0

Ich habe Ihre Lösung nicht getestet, aber ich weiß, dass die allgemeine Vorgehensweise funktioniert, da sie ein ähnliches Problem hier gelöst hat: http://stackoverflow.com/questions/5937174/how-can-i-ignore-case-in-a-regularexpression – Sean

Verwandte Themen