2016-09-02 2 views
4

J'ai une classe de modèle:Comment valider directement sur une liste <T>?

public class MyModel() { //properties here... } 

Et je veux valider une liste des objets MyModel. J'ai donc créé ce validateur:

class MyModelListValidator : AbstractValidator<List<MyModel>> 
{ 
    public MyModelListValidator() 
    { 
     RuleFor(x => x) 
      .SetCollectionValidator(new MyModelValidator()) 
      .When(x => x != null); 
    } 

    private class MyModelValidator : AbstractValidator<MyModel> 
    { 
     public MyModelValidator() 
     { 
      //MyModel property validation here... 
     } 
    } 
} 

Mais ce qui précède ne fonctionne pas. Une alternative est de créer une classe comme:

public class MyModelList() 
{ 
    public List<MyModel> Items { get; set; } 
} 

Cela fonctionnerait.

Mais existe-t-il un moyen de le faire sans utiliser cette classe supplémentaire?

+0

Si votre action se 'Liste ' en tant que paramètre, vous pouvez définir 'AbstractValidator ' et fluentvalidation app lement à chaque élément de la liste automatiquement. –

Répondre

0

Si vous utilisez des annotations de données pour effectuer la validation que vous pourriez avoir besoin d'un attribut personnalisé:

public class EnsureOneElementAttribute : ValidationAttribute 
{ 
    public override bool IsValid(object value) 
    { 
     var list = value as IList; 
     if (list != null) 
     { 
      return list.Count > 0; 
     } 
     return false; 
    } 
} 

puis:

[EnsureOneElement(ErrorMessage = "At least a person is required")] 
public List<Person> Persons { get; private set; } 
or to make it more generic: 

public class EnsureMinimumElementsAttribute : ValidationAttribute 
{ 
    private readonly int _minElements; 
    public EnsureMinimumElementsAttribute(int minElements) 
    { 
     _minElements = minElements; 
    } 

    public override bool IsValid(object value) 
    { 
     var list = value as IList; 
     if (list != null) 
     { 
      return list.Count >= _minElements; 
     } 
     return false; 
    } 
} 

puis:

[EnsureMinimumElements(1, ErrorMessage = "At least a person is required")] 
public List<Person> Persons { get; private set; } 
Personally I use FluentValidation.NET instead of Data Annotations to perform validation because I prefer the imperative validation logic instead of the declarative. I think it is more powerful. So my validation rule would simply look like this: 

RuleFor(x => x.Persons) 
    .Must(x => x.Count > 0) 
    .WithMessage("At least a person is required");