75 votes

Attribut requis pour une valeur entière

J'ai un viewmodel avec une propriété Id

[Required]
public int Id { get; set; }

Mais je pense que cet attribut ne fonctionne que pour les propriétés de type "string".

Si aucun identifiant n'est défini, l'identifiant a la valeur 0 et le modèle est valide.

Comment puis-je faire en sorte que le modèle soit invalide si aucune valeur n'est définie pour une propriété int ?

111voto

Lee Smith Points 1651

Utiliser le Range Attribut.

Fixer le minimum à 1 et le maximum à int.MaxValue

[Range(1, int.MaxValue, ErrorMessage = "Value for {0} must be between {1} and {2}.")]

0 votes

J'ai également envisagé cette option, mais que se passe-t-il si l'identifiant est égal à 0 ? Cela peut arriver :-)

4 votes

C'est vrai, mais cela dépend de l'architecture de votre base de données. Si vous utilisez des champs auto-incrémentés commençant à 1, vous ne risquez rien. La plupart des conceptions de bases de données que j'ai vues traitent le zéro comme une valeur spéciale qui ne peut pas se produire.

2 votes

Meilleure réponse, comme les choses viennent avec 0 du côté client, même si c'était nullable, ce serait toujours un int valide...

52voto

Julien Lebosquain Points 20894

Modifier le type en Nullable<int> (raccourci int? ) pour permettre à l null valeurs.

28 votes

Mais n'est-ce pas contraire à la logique ? En premier lieu, un int non nullable devrait se comporter comme s'il était requis sans aucun attribut requis. Et une valeur int. nullable devrait se comporter comme une valeur non requise.

6 votes

@user256034 Si zéro n'est pas valide, alors vous avez besoin d'un int nullable parce que Required ne fait qu'imposer l'existence d'une valeur int valide, dont 0 est valide. Vous comprenez ?

5 votes

Il n'est pas nécessaire que cela ait un sens, il suffit que ce soit vrai :-)

3voto

David Berg Points 734

Ceci est similaire à la réponse de @Lee Smith, mais permet à 0 d'être une entrée valide, ce qui peut être utile dans certains scénarios.

Ce que vous pouvez faire, c'est initialiser la valeur int à une autre valeur que 0, comme ceci :

[Range(0, int.MaxValue)]
public int value{ get; set; } = -1;

Il serait même possible de prendre en charge toutes les valeurs à l'exception de int.MinValue en procédant de la manière suivante :

[Range(int.MinValue + 1, int.MaxValue)]
public int value{ get; set; } = int.MinValue;

2voto

Dustin C Points 143

Pour .NET Core (et peut-être les versions antérieures), vous pouvez également créer un attribut personnalisé pour effectuer la validation de la plage afin de faciliter la réutilisation :

public class Id : ValidationAttribute
{
    protected override ValidationResult IsValid(
        object value,
        ValidationContext validationContext)
    {
        return Convert.ToInt32(value) > 0 ?
            ValidationResult.Success :
            new ValidationResult($"{validationContext.DisplayName} must be an integer greater than 0.");
    }
}

Utilisez l'attribut Id comme suit dans votre modèle :

public class MessageForUpdate
{
    [Required, Id]
    public int UserId { get; set; }
    [Required]
    public string Text { get; set; }
    [Required, Id]
    public int ChannelId { get; set; }
}

Lorsque l'Id est <= 0 ce message d'erreur est renvoyé :

UserId must be an integer greater than 0.

Il n'est pas nécessaire de vérifier que la valeur est inférieure à int.MaxValue (bien qu'il soit intéressant de l'indiquer dans le message), car l'API renvoie cette erreur par défaut avant d'en arriver là, même si la valeur est int.MaxValue + 1 :

The JSON value could not be converted to System.Int32

0voto

Dominik Kozioł Points 21

Si vous utilisez une base de données, vous devez utiliser les attributs [Key] y [DatabaseGenerated(DatabaseGenerated.Identity)] y Id ne devrait pas l'être NULLABLE .

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