90 votes

Validation ViewModel pour une liste

J'ai la définition de modèle de vue suivante

 public class AccessRequestViewModel
{
    public Request Request { get; private set; }
    public SelectList Buildings { get; private set; }
    public List<Person> Persons { get; private set; }
}

Donc dans ma demande il doit y avoir au moins 1 personne pour une demande d'accès. Quelle approche pourriez-vous utiliser pour valider? Je ne souhaite pas que cette validation se produise dans mon contrôleur, ce qui serait simple à faire. Le seul choix est-il un attribut de validation personnalisé ?

Edit : En cours de réalisation de cette validation avec FluentValidation (belle bibliothèque !)

 RuleFor(vm => vm.Persons)
                .Must((vm, person) => person.Count > 0)
                .WithMessage("At least one person is required");

25voto

rahulmohan Points 610

Le code suivant fonctionne dans asp.net core 1.1.

 [Required, MinLength(1, ErrorMessage = "At least one item required in work order")]
public ICollection<WorkOrderItem> Items { get; set; }

10voto

Sam Shiles Points 3254

La réponse de Darin est bonne mais la version ci-dessous vous donnera automatiquement un message d'erreur utile.

 public class MinimumElementsAttribute : ValidationAttribute
{
    private readonly int minElements;

    public MinimumElementsAttribute(int minElements)
    {
        this.minElements = minElements;
    }

    protected override ValidationResult IsValid(object value, ValidationContext validationContext)
    {
        var list = value as IList;

        var result = list?.Count >= minElements;

        return result
            ? ValidationResult.Success
            : new ValidationResult($"{validationContext.DisplayName} requires at least {minElements} element" + (minElements > 1 ? "s" : string.Empty));
    }
}

Usage:

 [MinimumElements(1)]
public List<Customer> Customers {get;set}

[MinimumElements(2)]
public List<Address> Addresses {get;set}

Message d'erreur:

  • Les clients nécessitent au moins 1 élément
  • Les adresses nécessitent au moins 2 éléments

2voto

AbdouMoumen Points 2748

Vous avez ici deux choix, soit créer un attribut de validation personnalisé et décorer la propriété avec, soit vous pouvez faire en sorte que votre ViewModel implémente l' IValidatableObject (qui définit une méthode Validate

J'espère que cela t'aides :)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X