2010-11-18 9 views
19

Mam ciąg znaków, który używam do sprawdzania poprawności po stronie klienta:RegularExpressionAttribute - Jak sprawić, aby w przypadku sprawdzania poprawności po stronie klienta nie była rozróżniana wielkość liter?

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

używam ten ciąg w moim atrybutem [RegularExpression(regex, ErrorMessage = "invalid")].

wiem, że /i flaga dla regex JavaScript jest używany, aby wielkość liter ma znaczenie, ale tylko sklejaniu go na końcu mojego regex (tj @"^....$/i" nie działa - walidacja regex nie całkowicie, niezależnie od tego, jest wpisany (ważne, czy nie).

Czego mi brakuje?

Odpowiedz

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! oczywiście! doskonała odpowiedź - muszę jednak zapytać: czy istnieje sposób użycia flagi niewrażliwej na wielkość liter? –

+1

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

+0

pytanie jest związane z RegularExpressionAttribute i tam musisz przekazać tylko ciąg. Nie można więc używać klasy Regex z atrybutami –

15

W języku C# można inline kilka regex opcje. aby określić opcję ignorowania sprawy należy dodać (?i) na początku swojej strukturze Jednak nie jestem pewien, w jaki sposób będzie to traktowane przez RegularExpressionAttribute i jeśli obsługuje tłumaczenie po stronie klienta. Z mojego doświadczenia z ASP.NET's RegularExpressionValidator Wątpię; regex powinien być vanilla wystarczy do pracy dla obu silników.

W każdym przypadku, czy to ważne by to wyglądać tak:

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

Działa ona przynajmniej dla ASP.NET MVC 2. Ale tylko po stronie serwera. –

29

Stworzyłem ten atrybut, który pozwala określić RegexOptions. EDYCJA: To także integruje się z dyskretną walidacją. Klient będzie przestrzegał tylko RegexOptions.Multiline i RegexOptions.IgnoreCase, ponieważ to właśnie obsługuje JavaScript.

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

Ten artykuł Anthony Stevens pomógł mi dostać tej pracy: ASP.NET MVC 3 Unobtrusive Javascript Validation With Custom Validators

+0

Nie przetestowałem twojego rozwiązania, ale wiem, że ogólne podejście działa, ponieważ rozwiązało podobny problem: http://stackoverflow.com/questions/5937174/how-can-i-ignore-case-in-a-regularexpression – Sean

Powiązane problemy