Est-il correct d'utiliser ModelState.Remove pour gérer ModelState?
Je travaille sur un gros MVC3 application web et avoir une gêne au sujet de la ModelState.IsValid
méthode.
ModelState est utilisé dans presque tous mes contrôleurs afin de valider les données affichées.
Les points de vue sont tous basés sur le Viewmodel qui contiennent différentes classes et ces classes contiennent des propriétés qui pourraient être marqués comme [Required]
.
Le problème que j'ai est les propriétés requises sont parfois pas nécessaire, et je vais avoir à utiliser la ModelState.Remove
méthode afin que ModelState.IsValid
devient vrai.
Ma question est par l'utilisation de ModelState.Remove
est-ce la bonne façon de faire les choses ou est-il une approche plus efficace.
source d'informationauteur Hesky
Vous devez vous connecter pour publier un commentaire.
Si vous êtes en utilisant le même modèle de vue avec un
[Required]
propriété dans deux contextes différents, l'un où la propriété est obligatoire et celui où il ne l'est pas, alors vous aurez besoin de modifier manuellement laModelState
que vous êtes en train de faire.Une alternative est d'utiliser un autre modèle de vue. Peut-être avoir une classe de base de toutes les propriétés à l'exception de la propriété en question. Ensuite dériver deux modèles, l'un avec le bien, où est-il, et avec la propriété où il ne l'est pas (c'est la duplication, je sais). Vous pouvez décider de les maintenir entièrement distincte de tout et de ne pas utiliser l'héritage.
Voici ma solution - un
RemoveFor()
méthode d'extension surModelState
sur le modèle MVC, HTML helpers:Voici comment il est utilisé :
Donc pour répondre à votre question, je crois qu'il y a certainement des cas d'utilisation où c'est la bonne façon de le faire, et fortement typé aide comme cela le rend beaucoup plus agréable à regarder et facile de justifier si vous êtes inquiet au sujet de beaucoup de chaînes magiques.
Fondamentalement, le problème est que si vos cours sont décorées avec [Nécessaire], il n'est pas toujours vrai. Si vous êtes d'exploitation dans un contexte où il n'est pas vrai, vous devriez vraiment être à l'aide d'une classe qui ne définit pas la propriété comme étant [Obligatoire].
Vous devriez vraiment utiliser un ViewModel qui est correctement défini pour son utilisation spécifique et que peut signifier la duplication de certaines classes. Un ViewModel est associée à la mise en œuvre de l'INTERFACE utilisateur et tandis qu'il peut utiliser des classes de modèle de domaine, il n'est pas toujours la bonne chose à faire.
À défaut, les options sont soit de ne pas utiliser ModelState.IsValid, ou de continuer à utiliser ModelState.Retirez.
Mais logiquement, il fait sens pour votre ViewModel pour être "traitement pouvant être validé', de ne pas avoir à ignorer certaines erreurs de validation.
Je suis totalement avec M. Steve Morgan
Donc, si votre Dernier n'a pas toujours besoin d'un certain bien être
Required
alors vous ne devriez pas le décorer comme Requis.Je ne sais pas pourquoi vous voulez cette question, mais je suppose que, dans certains cas, vous avez besoin
PropertyOne
êtreRequired
siPropertyTwo
a de la valeur.Dans ce cas, vous pouvez avoir besoin pour rendre votre
CustomValidationAttribute
pour vérifier ces deux propriétés.Je suis en utilisant quelque chose comme ceci :
remarque:
Statics.GetPropertyValue(...)
ne rien faire, mais obtenir la valeur de la propriété de les comparer.Espère que cela a aidé 🙂
Si votre propriété n'est pas toujours nécessaire, vous ne devriez pas le décorer avec des
[Required]
.Une bonne alternative pour faire de votre validation est d'implémenter l'interface Ivalidatableobjet.
Par exemple, disons que vous voulez faire sur le terrain
State
nécessaire seulement lorsque le pays estUnited States
. Vous pourriez le faire de cette façon :Remarque : Ce type de validation ne fonctionne que sur le côté serveur.
D'autres alternatives?
Comme mentionné dans d'autres réponses, c'est parfois une bonne idée de créer 2 ou plus de modèles si les points de vue et les validations sont très différents.