web-dev-qa-db-fra.com

Comment puis-je dire au validateur Data Annotations de valider également les propriétés des enfants complexes?

Puis-je valider automatiquement des objets enfants complexes lors de la validation d'un objet parent et d'inclure les résultats dans la population ICollection<ValidationResult>?

Si j'exécute le code suivant:

using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace ConsoleApplication1
{
    public class Person
    {
        [Required]
        public string Name { get; set; }

        public Address Address { get; set; }
    }

    public class Address
    {
        [Required]
        public string Street { get; set; }

        [Required]
        public string City { get; set; }

        [Required]
        public string State { get; set; }
    }

    class Program
    {
        static void Main(string[] args)
        {
            Person person = new Person
            {
                Name = null,
                Address = new Address
                {
                    Street = "123 Any St",
                    City = "New York",
                    State = null
                }
            };

            var validationContext = new ValidationContext(person, null, null);
            var validationResults = new List<ValidationResult>();

            var isValid = Validator.TryValidateObject(person, validationContext, validationResults);

            Console.WriteLine(isValid);

            validationResults.ForEach(r => Console.WriteLine(r.ErrorMessage));

            Console.ReadKey(true);
        }
    }
}

Je reçois la sortie suivante:

False
[.____] The Name field is required.

Mais je m'attendais à quelque chose de similaire à:

False
[.____] The Name field is required.
[.____] The State field is required.


J'ai offert une prime pour une meilleure solution de validation d'objet enfant, mais j'ai eu des preneurs, idéalement

  • valider les objets enfants à une profondeur arbitraire
  • manipulation de plusieurs erreurs par objet
  • identification correctement les erreurs de validation sur les champs d'objet enfant.

Je suis toujours surpris que le cadre ne soutient pas cela.

40
GWB

Vous devrez faire votre propre attribut de validateur (par exemple, [CompositeField]) qui valide les propriétés de l'enfant.

6
SLaks