2017-02-06 25 views
0

У меня есть следующая модель представления в приложении asp.net mvc.Как применить различные регулярные выражения для просмотра свойства модели?

[Required] 
public string Name { get; set; } 
[Required] 
public int Age { get; set; } 
public DateTime DateOfBirth { get; set; } 
public Address CurrentAddress { get; set; } 

Объект My Address содержит свойство Post Code, которое имеет атрибут RegularExpession для проверки почтовых индексов Великобритании.

public class Address 
{ 
    ... 
    [RegularExpression(@"^[A-Z]{1,2}[0-9][0-9A-Z]? [0-9][A-Z]{2}$")] 
    public string PostCode { get; set; } 
    ... 
} 

Я хочу расширить текущую функциональность, чтобы проверять PostCode, используя другое регулярное выражение, например, если человек не является резидентом Великобритании.

Любые идеи, как я мог бы это достичь? Есть ли способ изменить значение регулярного выражения во время выполнения? Если вам нужна дополнительная информация, сообщите мне, и я обновлю вопрос.

+0

Возможного дубликат (http://stackoverflow.com/questions/11959431/how-to-create -a-custom-validation-attribute) – eocron

+0

Вы не можете изменить значение атрибута во время выполнения (атрибуты являются метаданными и должны быть известны во время компиляции). Вы можете написать свой собственный условный атрибут проверки и передать регулярное выражение для каждой страны и условно применить регулярное выражение на основе выбранной страны. Но ваш код будет огромным (например, регулярное выражение для проверки австралийского почтового кода: '^ (0 [289] [0-9] {2}) | ([1345689] [0-9] {3}) | (2 [0-8] [0-9] {2}) | (290 [0-9]) | (291 [0-4]) | (7 [0-4] [0-9] {2}) | (7 [8-9] [0-9] {2}) $ ') –

+0

И вы можете проверить [эти ответы] (http://stackoverflow.com/questions/164979/uk-postcode-regex- всеобъемлющий), которые обсуждают регулярное выражение для британских почтовых индексов –

ответ

1

Вы можете создать свой собственный атрибут Person dependand: [? Как создать атрибут пользовательской проверки]

public class MyTestAttribute : ValidationAttribute 
{ 
    private readonly Regex _regex1; 
    private readonly Regex _regex2; 

    public MyTestAttribute(string regex1, string regex2) 
    { 
     _regex1 = new Regex(regex1); 
     _regex2 = new Regex(regex2); 
    } 

    public override bool Match(object obj) 
    { 
     var input = (string) obj; 
     if (IsUk()) 
     { 
      return _regex1.IsMatch(input); 
     } 
     return _regex2.IsMatch(input); 
    } 

    private bool IsUk() 
    { 
     //is person in UK 
    } 
} 
+0

Хорошо, но как бы передать некоторые параметры, чтобы указать, какое регулярное выражение я бы хотел использовать? – Grentley

+1

Возможно, стоит добавить код, чтобы продемонстрировать, как работают пользовательские атрибуты проверки. Например, как получить значение, которое проверяется, и как получить доступ к другому полю в форме, которая сообщает вам, какую проверку использовать. Поскольку этот ответ указывает на неопределенное направление, но на самом деле это не намного больше, чем комментарий. Конечно, не очень хороший ответ. – Chris

+0

Фактически причина, по которой я использую класс Address, заключается в том, что он сильно используется другими частями системы. Мне нужно, чтобы он работал таким же образом. – Grentley

 Смежные вопросы

  • Нет связанных вопросов^_^