2

Это моя модель:Изменить Validation недвижимости в ASP.NET MVC 3 по условию

[RegularExpression(@"^08[589][0-9]{8}$", ErrorMessage = "Invalid Number!")] 
public string Phone { get; set; } 

[ForeignKey] 
public long PhoneType { get; set; } // 1-CellPhone , 2-Phone 

Так что я думаю, что изменить RegularExpression Проверки по изменению PhoneType, если я хочу сказать более конкретно:

если пользователь может выбрать из CellPhoneDropDownList валидация быть

[RegularExpression(@"^08[589][0-9]{8}$", ErrorMessage = "Invalid Number!")] 

и если выберите Phone проверка будет

[RegularExpression("^[1-9][0-9]{9}$", ErrorMessage = "Invalid Number!")] 

Какое ваше предложение?

ответ

6

Вы можете написать атрибут пользовательского проверки:

public class PhoneAttribute : ValidationAttribute 
{ 
    private readonly string _phoneTypeProperty; 
    public PhoneAttribute(string phoneTyperoperty) 
    { 
     _phoneTypeProperty = phoneTyperoperty; 
    } 

    protected override ValidationResult IsValid(object value, ValidationContext validationContext) 
    { 
     var property = validationContext.ObjectType.GetProperty(_phoneTypeProperty); 
     if (property == null) 
     { 
      return new ValidationResult(string.Format("Unknown property: {0}", _phoneTypeProperty)); 
     } 

     var phone = Convert.ToString(value, CultureInfo.CurrentCulture); 
     if (string.IsNullOrEmpty(phone)) 
     { 
      return null; 
     } 

     var phoneType = (long)property.GetValue(validationContext.ObjectInstance, null); 
     Regex regex = null; 
     if (phoneType == 1) 
     { 
      regex = new Regex(@"^08[589][0-9]{8}$"); 
     } 
     else if (phoneType == 2) 
     { 
      regex = new Regex("^[1-9][0-9]{9}$"); 
     } 
     else 
     { 
      return new ValidationResult(string.Format("Unknown phone type: {0}", phoneType)); 
     } 

     var match = regex.Match(phone); 
     if (match.Success && match.Index == 0 && match.Length == phone.Length) 
     { 
      return null; 
     } 

     return new ValidationResult(FormatErrorMessage(validationContext.DisplayName)); 
    } 
} 

, а затем украсить свой вид модели свойства с этим атрибутом:

public class MyViewModel 
{ 
    [Phone("PhoneType", ErrorMessage = "Invalid Number!")] 
    public string Phone { get; set; } 

    public long PhoneType { get; set; } 
} 

Другая возможность (и которые я бы более сильно рекомендую), если вы хотите облегчить свою жизнь с помощью проверки, используйте FluentValidation.NET. Просто посмотрите, как проще определить правила проверки, а не писать gazzilions линий сантехнического кода и больше не иметь возможности понять, какая часть является сантехникой, а какая часть является фактической валидацией. С FluentValidation.NET нет сантехники. Вы четко выражаете свои требования к валидации:

public class MyViewModelValidator : AbstractValidator<MyViewModel> 
{ 
    public MyViewModelValidator() 
    { 
     RuleFor(x => x.Phone) 
      .Matches(@"^08[589][0-9]{8}$").When(x => x.PhoneType == 1) 
      .Matches("^[1-9][0-9]{9}$").When(x => x.PhoneType == 2); 
    } 
} 

Просто сравните этот валидатор с предыдущим.

+0

является FluentValidation.NET внедрить простой способ, а также зарегистрировать на стороне клиента ненавязчивую проверку? –

+0

@WahidBitar, да, FluentValidation.NET поддерживает те же правила проверки клиента, что и аннотации данных. –

+0

@DarinDimitrov Спасибо за ответ, но есть некоторые проблемы для работы с FluentValidation.Net, сначала: как говорится в документации: FluentValidation также будет работать с проверкой на стороне клиента ASP.NET MVC, но не все правила поддерживаются. Например, любые правила, определяемые с помощью условия (с использованием/без), пользовательских валидаторов или вызовов Must, не будут выполняться на стороне клиента. и Second: я не могу контролировать ErrorMessage на стороне клиента. Я прав? – Saeid