2012-04-25 3 views
1

На моем многостраничном сайте у меня есть форма для создания адреса. Я хочу настроить мои правила проверки по странам (например: FR ZipCode length 8, USA: 10 ...), и я колеблюсь между многими решениями: один ViewModel по странам, параметризованная аннотация, DataFilter ... Любая идея?Правила проверки нескольких стран

public class Address 
{ 
    [Required] 
    public string Name { get; set; } 
    [StringLength(lengthByCountry)] 
    public string ZipCode { get; set; } 
} 

ответ

1

Вы можете использовать CustomValidationAttribute, чтобы написать свой собственный валидатор, который делает конкретной стране проверку почтовых индексов в зависимости от страны.

+0

с CustomValidationAttribute Мне нужно вручную выполнить проверку на стороне клиента, правильно? – rad

+0

@rad: 'CustomValidationAttribute' позволяет вам подключиться к фреймворку проверки и написать собственный валидатор, который делает что-то еще, кроме проверки длины строки или регулярного выражения. Это «ручная» работа, да, но вам не нужно вызывать метод проверки в вашем коде. Так же, как вам не нужно вызывать проверку длины строки, когда вы используете 'StringLengthAttribute'. –

1

Если страна и почтовый индекс должны быть указаны в рамках одной и той же заявки, я бы предложил сделать вашу модель реализации IValidatableObject, которая позволяет проверять на основе комбинаций значений.

public class Address : IValidatableObject 
{ 
    [Required] 
    public string Name { get; set; } 

    public string Country { get; set; } 

    public string ZipCode { get; set; } 

    public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) 
    { 

     var results = new List<ValidationResult>(); 

     switch (Country) 
     { 
      case "France": 
       if (ZipCode.Length < 8) 
        results.Add(
         new ValidationResult("French zip codes must be at least 8 characters", new List<string> { "ZipCode" }) 
        ); 
       break; 

      case "U.S.": 
       if (ZipCode.Length < 10) 
        results.Add(
         new ValidationResult("American zip codes must be at least 10 characters", new List<string> { "ZipCode" }) 
        ); 
       break; 

      // Etc. 
     } 

     return results; 

    } 

} 
+0

Я действительно не понимаю, почему почти каждый, предлагающий IValidateableObject, не упоминает, что он не выполняет проверку на стороне клиента. Это вполне приемлемое решение во многих случаях, но люди должны знать, что это может вызвать странность в их рабочих процессах валидации. –

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