7 votes

.NET Core 2.2 : Valider les propriétés [requises] uniquement lorsque l'objet n'est pas nul

J'ai un modèle complexe avec des objets imbriqués. Je veux seulement que mon [Required] les attributs doivent être validés lorsque l'objet sur lequel ils se trouvent n'est pas null . Ainsi, par exemple, si j'ai un Home avec une classe Address la propriété Home.Address.Street ne doit être que [required] si le Address n'est pas null .

Code

Dans ASP.NET Core, j'ai un modèle qui ressemble à ceci :

public class Home
{
    [Required]
    public int Number {get;set;}
    public Address Address {get;set;} // This is not required
}

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

}

Dans un contrôleur, j'ai une méthode d'action qui ressemble à ceci :

[HttpPost]
public string AddHomes([FromForm]List<Home> homes) 
{
    if(!ModelState.IsValid)
    {
        return BadRequest();
    }
    // Do some saving
    return Ok();  
}

Et la charge utile du formulaire ressemble à ça :

homes.Index: 0
homes[0].number: 1

Dans ASP.NET Core 2.2, le premier bouton Home dans le homes est marquée comme invalide, mais elle fonctionnait comme prévu dans ASP.NET Core 2.1.

Ce que je veux, c'est que le [Required] pour qu'il ne soit validé que si l'attribut Address n'est pas null . Donc un Home peut soit ont un Address con un Street ou no Address du tout.

Est-ce réalisable dans .NET Core 2.2 ?


Nota: J'ai inclus un exemple mis à jour ci-dessous pour reproduire l'erreur. Il semble que l'inclusion de IFormFile provoque le Address pour s'initialiser.

{
    "errors": {
        "homes[0].Address.Street": [
            "The Street field is required."
        ]
    },
    "title": "One or more validation errors occurred.",
    "status": 400,
    "traceId": "80000009-0003-ff00-b63f-84710c7967bb"
}

J'ai également ouvert une question sur GitHub à ce sujet il y a quelque temps, si quelqu'un veut y donner suite : L'inclusion de la propriété IFormFile oblige à valider l'ensemble de l'objet. ASP.NET Core 2.2 .

2voto

Chris Pratt Points 53859

Le comportement que vous souhaitez es le comportement pour les propriétés de référence nulles, et il n'a pas changé dans ASP.NET Core 2.2. Les propriétés de la classe référencée ne sont validées que si la référence elle-même est non nulle. Si cela ne fonctionne pas pour vous, alors la seule conclusion est que cette propriété de référence fait ont une valeur. Il peut s'agir simplement d'une instanciation par défaut (c.-à-d. new Foo() ), sans qu'aucune des sous-propriétés ne soit réellement définie, mais cela suffit à déclencher la validation.

Tout d'abord, assurez-vous que vous ne définissez pas une valeur par défaut pour la propriété, ou que vous ne lui fournissez pas une valeur par défaut par le biais du contructeur, par exemple. En d'autres termes, si vous avez quelque chose comme :

public Bar Bar { get; set; } = new Bar();

Ou,

public Foo()
{
    Bar = new Bar();
}

Enlevez ça.

Réalisez également que si tout ce qui est est affiché pour cette propriété de référence, alors tout entre en jeu. Même si vous avez juste une propriété cachée comme :

<input type="hidden" asp-for="Bar.Id" />

Si une seule propriété de la référence est enregistrée, même si elle n'est pas valide, toutes les validations de la classe entrent en jeu.

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