Validation des valeurs d’énumération dans C # MVC. Une validation partielle se produit – Comment changer le comportement de validation?

Dans ma vue razor, j’ai représenté une enum en tant que champ masqué, qui est renvoyé au résultat d’une action.

J’ai remarqué que, lorsqu’il lie la valeur de chaîne fournie dans le code HTML, il valide automatiquement la valeur de l’énum.

///  /// Quiz Types Enum ///  public enum QuizType { ///  /// Scored Quiz ///  Scored = 0, ///  /// Personality Type Quiz ///  Personality = 1 } 

Rasoir:

 @Html.HiddenFor(x => x.QuizType) 

HTML rendu:

  

Si je modifie la valeur dans le DOM en une valeur incorrecte et soumets le formulaire, ModelState.IsValid renvoie false et l’erreur suivante est ajoutée à ModelState:

 "The value 'myincorrectvalue' is not valid for QuizType." 

C’est tout ce qu’il y a de plus cher, mais j’ai pensé que si je créais un modèle de vue, je devais définir explicitement les règles de validation sur mon modèle de vue, telles que l’atsortingbut [Required] .

En outre, il existe un atsortingbut de validation spécifiquement appelé EnumDataType .

 [EnumDataType(typeof(QuizType))] public QuizType QuizType { get; set; } 

Question

Si la validation se produit automatiquement lors de la liaison, à quoi sert l’atsortingbut de validation de données EnumDataType ?

Ok, alors j’ai trouvé la réponse à ma propre question.

Le message d’erreur qui apparaît est plutôt un message d’erreur générique pour lequel la liaison n’était pas possible. Lorsque la liaison tente de lier une représentation sous forme de chaîne inexistante de la valeur enum publiée du code HTML vers l’énum, ​​elle génère l’erreur:

 The value 'myincorrectvalue' is not valid for QuizType. 

Le même message d’erreur s’afficherait si je tentais de lier une valeur de chaîne à un int de ma classe View Model.

Il semble que le problème est que, en plus de la représentation sous forme de chaîne, une énumération peut être une valeur entière. Je peux définir un enum sur n’importe quel nombre, même si ce nombre n’existe pas dans mon enum.

 ///  /// Quiz Types Enum ///  public enum QuizType { ///  /// Scored Quiz ///  Scored = 0, ///  /// Personality Type Quiz ///  Personality = 1 } 

Par conséquent, ceci est valide et sera lié sans erreur à la valeur de mon enum, même si 1000 n’existe pas dans mon enum:

  // Binder will bind this just fine QuizType = 1000 

C’est là que l’ EnumDataType validation EnumDataType entre en jeu. Si j’ajoute l’atsortingbut de validation à mon enum dans mon modèle de vue:

 [EnumDataType(typeof(QuizType), ErrorMessage = "Quiz type value doesn't exist within enum")] public QuizType QuizType { get; set;} 

Avec l’atsortingbut en place, je ne pourrai affecter que mes valeurs d’enum valides (0 ou 1 pour cet exemple).

Ainsi, les représentations STRING incorrectes publiées à partir du code HTML sont validées automatiquement lors de la liaison, mais pas la vérification de toute valeur entière.

J’espère que cela clarifie la validation d’ENUMS dans ASP.NET MVC.