2011-12-08 6 views
14

Zarządzamy kilka ASP.NET MVC witryn klienta, które używają adnotacji danych jak poniżej, aby sprawdzić poprawność adresów e-mail klienta (Nie włączone regex tutaj, dla czytelności):Jak ustawić argument regularnego wyrażenia adnotacji danych RegularExpression w środowisku wykonawczym?

[Required(ErrorMessage="Email is required")] 
[RegularExpression(@"MYREGEX", ErrorMessage = "Email address is not valid")] 
public string Email { get; set; } 

Co ja chciałoby się scentralizować to wyrażenie regularne, aby po wprowadzeniu w nim zmian wszystkie strony natychmiast go odbierały i nie musimy ręcznie zmieniać ich w każdym z nich.

Problem polega na tym, że argument regex adnotacji danych musi być stały, więc nie mogę przypisać wartości pobranej z pliku konfiguracyjnego lub bazy danych w czasie wykonywania (co było moją pierwszą myślą).

Czy ktoś może mi pomóc w sprytnym rozwiązaniu tego - lub w przeciwnym razie - alternatywnym podejściu, które pomoże osiągnąć ten sam cel? Czy to po prostu wymaga od nas napisania specjalistycznego niestandardowego atrybutu sprawdzania poprawności, który będzie akceptował wartości niestałe?

+0

[E Zwykły Ekspresja MVC C#] (http://lesson8.blogspot.com/2013/03/email-regular-expression-mvc-c.html) – Sender

+1

'[EmailAddress (errorMessage = "Nieprawidłowy adres e-mail")] 'jest już zawarty w' System.ComponentModel.DataAnnotations.dll' –

Odpowiedz

26

Najprostszym sposobem jest napisanie zwyczaj ValidationAttribute która dziedziczy RegularExpressionAttribute, więc coś takiego:

public class EmailAttribute : RegularExpressionAttribute 
    { 
     public EmailAttribute() 
      : base(GetRegex()) 
     { } 

     private static string GetRegex() 
     { 
      // TODO: Go off and get your RegEx here 
      return @"^[\w-]+(\.[\w-]+)*@([a-z0-9-]+(\.[a-z0-9-]+)*?\.[a-z]{2,6}|(\d{1,3}\.){3}\d{1,3})(:\d{4})?$"; 
     } 
    } 

ten sposób, nadal utrzymują wykorzystanie wbudowanej w walidacji Regex ale można go dostosować.Można by po prostu go używać jak:

[Email(ErrorMessage = "Please use a valid email address")] 

Wreszcie, aby dostać się do walidacji po stronie klienta do pracy, należy po prostu dodać następujące metody Application_Start w terminie Global.asax, aby powiedzieć MVC korzystać z normalnej walidacji wyrażenie regularne w tym weryfikatora:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(EmailAttribute), typeof(RegularExpressionAttributeAdapter)); 
+0

Akceptuję to, ponieważ ja t było prostym, kompletnym rozwiązaniem, dobrze wyjaśnionym. Dzięki! –

+0

Dzięki Mark i bez zmartwień, cieszę się, że pomogło! –

+0

Trwa to przez jakiś czas, ale czy ktoś może wyjaśnić, w jaki sposób zostały wypisane z pliku zasobów? Mogę uzyskać oczekiwane języki w moim modelu (na przykład komunikat o błędzie), ale zawsze otrzymuję wyrażenie regularne dla domyślnego pliku '.resx' z rozszerzenia, gdy jest używane powyżej. Jakieś pomysły? –

3

Czy na pewno chcesz umieścić wyrażenie regularne w pliku bazy danych/config, czy chcesz je scentralizować? Jeśli chcesz tylko umieścić regex razem, można po prostu zdefiniować i używać stałych jak

public class ValidationRegularExpressions { 
    public const string Regex1 = "..."; 
    public const string Regex2 = "..."; 
} 

Może chcesz zarządzać regexes w plikach zewnętrznych, można napisać zadanie MSBuild zrobić wymianę podczas budowania produkcja.

Jeśli naprawdę chcesz zmienić regex walidacji w czasie wykonywania, zdefiniować własną ValidationAttribute, jak

[RegexByKey("MyKey", ErrorMessage = "Email address is not valid")] 
public string Email { get; set; } 

To tylko kawałek kodu napisać:

public class RegexByKeyAttribute : ValidationAttribute { 
    public RegexByKey(string key) { 
     ... 
    } 

    // override some methods 
    public override bool IsValid(object value) { 
     ... 
    } 
} 

lub nawet tylko:

public class RegexByKeyAttribute : RegularExpressionAttribute { 
    public RegexByKey(string key) : base(LoadRegex(key)) { } 

    // Be careful to cache the regex is this operation is expensive. 
    private static string LoadRegex(string key) { ... } 
} 

Mam nadzieję, że to pomoże: http://msdn.microsoft.com/en-us/library/cc668224.aspx