2016-01-25 1 views
2

Я стараюсь, чтобы список имел уникальные SSN. Я получаю «Имя свойства не может быть автоматически определено для элемента element => element. Укажите либо имя настраиваемого свойства, вызвав ошибку« WithName ». Знаем ли мы, что я здесь делаю неправильно?Проверьте свойства, уникальные в списке в FluentValidation

using FluentValidation; 
    using FluentValidation.Validators; 

    public class PersonsValidator : AbstractValidator<Persons>  
    { 
     public PersonsValidator() 
     { 
      this.RuleFor(element => element) 
       .SetValidator(new SSNNumbersInHouseHoldShouldBeUnique<Persons>()) 
.WithName("SSN"); 
       .WithMessage("SSN's in household should be unique"); 
     } 
    } 

    public class SSNNumbersInHouseHoldShouldBeUnique<T> : PropertyValidator 
    { 
     public SSNNumbersInHouseHoldShouldBeUnique() 
     : base("SSN's in household should be unique") 
     { 
     } 

     protected override bool IsValid(PropertyValidatorContext context) 
     { 
      var persons = context.Instance as Persons; 
      try 
      { 
       if (persons == null) 
       { 
        return false; 
       } 

       var persons = persons.Where(element => element.SSN.Trim().Length > 0); 
       var allSSNs = persons.Select(element => element.SSN.Trim()); 
       if (allSSNs.Count() > allSSNs.Distinct().Count()) 
       { 
        return false; 
       } 
       return true; 
      } 
      catch (Exception ex) 
      { 
       return false; 
      } 
     } 
    } 

    public class Persons : List<Person> 
    {} 

    public class Person 
    { 
     public string SSN{ get; set; } 
    } 
+0

Не должно быть элемент 'element = >.SSN'? Или сохраните элемент element => и используйте '.WithName (" SSN ")', как он предлагает – Rob

+0

Спасибо, Роб. Нет такого элемента => element.SSN. Использование .WithName ("SSN") также вызывает такую ​​же ошибку. Кажется, я делаю что-то принципиально неправильное. Я отредактировал этот вопрос выше. –

ответ

2

Я использовал FluentValidation версии 4.6. По словам Джереми Скиннера (автора FluentValidation), мне нужно быть как минимум 5.6, чтобы иметь возможность использовать правила уровня модели (например, RuleFor (element => element)). В качестве обходного пути я добавил эту проверку только для собственно класса, а не для создания класса проверки. Надеюсь, это поможет кому-то.

using FluentValidation; 
using FluentValidation.Results; 

public class Persons : List<Person> 
{ 
public void ValidateAndThrow() 
     { 
      var errors = new List<ValidationFailure>(); 
      try 
      { 
       var persons = this.Where(element => element.SSN.Trim().Length > 0); 
       var allSSNs = persons.Select(element => element.SSN.Trim()); 
       if (allSSNs.Count() > allSSNs.Distinct().Count()) 
       { 
        var validationFailure = new ValidationFailure("UniqueSSNsInHouseHold", "SSN's in a household should be unique"); 
        errors.Add(validationFailure); 
       }   
      } 
      catch (Exception ex) 
      { 
      } 

      if (errors.Any()) 
      { 
       throw new ValidationException(errors); 
      } 
     } 
} 
Смежные вопросы