2015-05-19 5 views
1

Я использую FluentValidation с IDataErrorInfo, и я валидатор определяется следующим образом:FluentValidation не работает для нулевой собственности

public class StsInfoValidator : AbstractValidator<StsInfo> 
{ 
    public StsInfoValidator() 
    { 
     RuleFor(x => x.SomeProperty).Cascade(CascadeMode.StopOnFirstFailure) 
      .NotNull().NotEmpty().WithMessage("SomeProperty is required."); 

    }   
} 

Однако, переходя в null собственности, кажется, не вызывает валидатор:

#region IDataErrorInfo 

public string this[string columnName] 
{ 
    get 
    { 

     var validator = new StsInfoValidator(); 

     if (columnName.Equals("SomeProperty")) 
     { 
      // SomeProperty below is null 
      if (validator.Validate(this, SomeProperty).Errors.Any()) 
       return validator.Validate(this, CampusNexusApiServer).Errors.FirstOrDefault().ErrorMessage; 
      else 
      { 
       validator = null; 
       return string.Empty; 
      } 
     } 

     return string.Empty; 
    } 
} 

#endregion 
+0

Есть FallbackValue или TargetNullValue для привязки, которые удовлетворяют сценарию при возврате привязки Null Также вы можете объяснить немного больше, что вы подразумеваете под Null P roperty – Versatile

ответ

2

проблема у вас есть то, что если вы решите использовать Validate перегрузку, которая требует лямбда-выражения для оценки вашего имущества вы должны сделать:

Вместо:

validator.Validate(this, SomeProperty);

вам нужно:

validator.Validate(this, s => s.SomeProperty);

Вот эту документацию перегрузки:

enter image description here

В качестве альтернативы вы можете использовать другой Validate перегрузки и передать имя Вашей собственности в виде строки:

validator.Validate(this, columnName); или validator.Validate(this, "SomeProperty");

Вот свойство Name (s) перегрузки Validate:

enter image description here

public string this[string columnName] 
    { 
     get 
     { 

      var validator = new StsInfoValidator(); 

      if (columnName.Equals("SomeProperty")) 
      { 
       // SomeProperty below is null 
       //option 1 
       var result = validator.Validate(this,s => s.SomeProperty); 
       //option 2 
       //var result = validator.Validate(this, columnName); 
       //option 3 
       //var result = validator.Validate(this, "SomeProperty"); 
       if (result.Errors.Any()) 
        return validator.Validate(this, CampusNexusApiServer).Errors.FirstOrDefault().ErrorMessage; 
       else 
       { 
        validator = null; 
        return string.Empty; 
       } 
      } 

      return string.Empty; 
     } 
    }