Je me demandais s'il était possible de désactiver l'attribut de validation requis dans certaines actions du contrôleur. Je me demande cela car sur l'un de mes formulaires d'édition, je n'oblige pas l'utilisateur à saisir des valeurs pour les champs qu'il a déjà spécifiés précédemment. Cependant, j'implémente ensuite une logique selon laquelle lorsqu'ils entrent une valeur, ils utilisent une logique spéciale pour mettre à jour le modèle, comme le hachage d'une valeur, etc.
Des suggestions pour contourner ce problème?
EDIT:
Et oui, la validation du client est un problème ici, car elle ne leur permettra pas de soumettre le formulaire sans entrer une valeur.
c#
asp.net-mvc
asp.net-mvc-3
data-annotations
Alex Hope O'Connor
la source
la source
RequiredAttr
complètement le fichier et à effectuer une vérification côté serveur lorsque vous en avez besoin. Mais ce serait délicat pour le clientRéponses:
Ce problème peut être facilement résolu en utilisant des modèles de vue. Les modèles de vue sont des classes spécifiquement adaptées aux besoins d'une vue donnée. Par exemple, dans votre cas, vous pourriez avoir les modèles de vue suivants:
qui seront utilisés dans leurs actions de contrôleur correspondantes:
la source
Update(FormCollection collection)
, du moins je ne le fais jamais. Je définis et toujours utiliser un modèle de vue spécifique:Update(UpdateViewView model)
.Insert
. Merci de l'avoir signalé.Si vous souhaitez simplement désactiver la validation pour un seul champ côté client, vous pouvez remplacer les attributs de validation comme suit:
la source
@Html.TexBoxFor(model => model.SomeValue, new { data_val = false })
- plus facile à lire IMO.$(".search select").attr('data-val', false);
Je sais que cette question a reçu une réponse il y a longtemps et que la réponse acceptée fera réellement le travail. Mais il y a une chose qui me dérange: ne devoir copier que 2 modèles pour désactiver une validation.
Voici ma suggestion:
De cette façon, vous n'avez pas à vous soucier des validations côté client / serveur, le framework se comportera comme il est censé le faire. De plus, si vous définissez un
[Display]
attribut sur la classe de base, vous n'avez pas à le redéfinir dans votre fichierUpdateModel
.Et vous pouvez toujours utiliser ces classes de la même manière:
la source
Vous pouvez supprimer toute validation d'une propriété avec ce qui suit dans votre action de contrôleur.
Commentaire de @ Ian concernant MVC5
Ce qui suit est toujours possible
Peu ennuyeux que vous perdiez la saisie statique avec l'API mise à jour. Vous pouvez réaliser quelque chose de similaire à l'ancienne méthode en créant une instance de l'aide HTML et en utilisant les méthodes NameExtensions .
la source
ModelState
qui correspond à cette signature. Pas dans MVC 5, du moins.Côté client Pour désactiver la validation d'un formulaire, plusieurs options basées sur mes recherches sont données ci-dessous. J'espère que l'un d'eux fonctionnera pour vous.
Option 1
Je préfère cela, et cela fonctionne parfaitement pour moi.
et l'invoquant comme
Option 2
Option 3
Option 4
Option 5
Du côté serveur
Créez un attribut et marquez votre méthode d'action avec cet attribut. Personnalisez-le pour l'adapter à vos besoins spécifiques.
Une meilleure approche a été décrite ici Activer / Désactiver dynamiquement la validation côté serveur mvc
la source
Personnellement, j'aurais tendance à utiliser l'approche de Darin Dimitrov dans sa solution. Cela vous permet de pouvoir utiliser l'approche d'annotation de données avec validation ET d'avoir des attributs de données séparés sur chaque ViewModel correspondant à la tâche à accomplir. Pour minimiser la quantité de travail pour la copie entre le modèle et le modèle de vue, vous devez examiner AutoMapper ou ValueInjecter . Les deux ont leurs points forts individuels, alors vérifiez-les tous les deux.
Une autre approche possible pour vous serait de dériver votre viewmodel ou model de IValidatableObject. Cela vous donne la possibilité d'implémenter une fonction Valider. Dans validate, vous pouvez renvoyer une liste d'éléments ValidationResult ou émettre un retour de rendement pour chaque problème détecté lors de la validation.
Le ValidationResult se compose d'un message d'erreur et d'une liste de chaînes avec les noms de champ. Les messages d'erreur seront affichés à un emplacement près du ou des champs d'entrée.
la source
Le moyen le plus propre ici, je pense, va désactiver votre validation côté client et du côté serveur, vous devrez:
Il semble que même un modèle de vue personnalisé ici ne résoudra pas le problème car le nombre de ces champs «pré-répondus» pourrait varier. Si ce n'est pas le cas, un modèle de vue personnalisé peut en effet être le moyen le plus simple, mais en utilisant la technique ci-dessus, vous pouvez contourner vos problèmes de validation.
la source
c'était la réponse de quelqu'un d'autre dans les commentaires ... mais cela devrait être une vraie réponse:
$("#SomeValue").removeAttr("data-val-required")
testé sur MVC 6 avec un champ ayant l'
[Required]
attributréponse volée sur https://stackoverflow.com/users/73382/rob ci-dessus
la source
J'avais ce problème lors de la création d'une vue d'édition pour mon modèle et je souhaite mettre à jour un seul champ.
Ma solution pour la manière la plus simple est de mettre les deux champs en utilisant:
Les commentaires sont le champ que je mets à jour uniquement dans la vue d'édition, qui n'a pas d'attribut requis.
Entité ASP.NET MVC 3
la source
AFAIK vous ne pouvez pas supprimer l'attribut au moment de l'exécution, mais seulement changer leurs valeurs (c'est-à-dire: lecture seule vrai / faux) cherchez ici quelque chose de similaire . Comme autre façon de faire ce que vous voulez sans déranger les attributs, j'irai avec un ViewModel pour votre action spécifique afin que vous puissiez insérer toute la logique sans casser la logique nécessaire aux autres contrôleurs. Si vous essayez d'obtenir une sorte d'assistant (un formulaire à plusieurs étapes), vous pouvez à la place sérialiser les champs déjà compilés et avec TempData les amener le long de vos étapes. (pour obtenir de l'aide sur la sérialisation de la désérialisation, vous pouvez utiliser les futurs MVC )
la source
Ce que @Darin a dit est ce que je recommanderais également. Cependant, j'ajouterais (et en réponse à l'un des commentaires) que vous pouvez en fait également utiliser cette méthode pour les types primitifs comme bit, bool, même des structures comme Guid en les rendant simplement nullables. Une fois que vous faites cela, l'
Required
attribut fonctionne comme prévu.la source
À partir de MVC 5, cela peut être facilement réalisé en ajoutant ceci dans votre fichier
global.asax
.la source
Je cherchais une solution où je peux utiliser le même modèle pour une insertion et une mise à jour dans l'API Web. Dans ma situation, est-ce toujours un contenu corporel. Les
[Requiered]
attributs doivent être ignorés s'il s'agit d'une méthode de mise à jour. Dans ma solution, vous placez un attribut[IgnoreRequiredValidations]
au-dessus de la méthode. C'est comme suit:Que faut-il faire d'autre? Un propre BodyModelValidator doit être créé et ajouté au démarrage. Ceci est dans la HttpConfiguration et ressemble à ceci:
config.Services.Replace(typeof(IBodyModelValidator), new IgnoreRequiredOrDefaultBodyModelValidator());
Mon propre BodyModelValidator est dérivé de DefaultBodyModelValidator. Et je me suis rendu compte que je devais ignorer la méthode «ShallowValidate». Dans ce remplacement, je filtre les validateurs de modèle requis. Et maintenant, la classe IgnoreRequiredOrDefaultBodyModelValidator et la classe d'attribut IgnoreRequiredValidations:
Sources:
string debug = new StackTrace().ToString()
pour savoir qui gère la validation du modèle.la source
Si vous ne souhaitez pas utiliser un autre ViewModel, vous pouvez désactiver les validations client sur la vue et également supprimer les validations sur le serveur pour les propriétés que vous souhaitez ignorer. Veuillez vérifier cette réponse pour une explication plus approfondie https://stackoverflow.com/a/15248790/1128216
la source
Dans mon cas, le même modèle a été utilisé dans de nombreuses pages à des fins de réutilisation. Donc ce que j'ai fait, c'est d'avoir créé un attribut personnalisé qui vérifie les exclusions
et dans votre contrôleur
Disons que le modèle est
la source
Oui, il est possible de désactiver l'attribut requis. Créez votre propre attribut de classe personnalisé (exemple de code appelé ChangeableRequired) à partir de RequiredAtribute et ajoutez une propriété désactivée et remplacez la méthode IsValid pour vérifier si elle est déséquilibrée. Utilisez la réflexion pour définir la propriété désactivée, comme ceci:
Attribut personnalisé:
Mettez à jour votre propriété pour utiliser votre nouvel attribut personnalisé:
où vous devez désactiver la propriété, utilisez la réflexion pour la définir:
C'est agréable et propre?
NB: La validation ci-dessus sera désactivée tant que votre instance d'objet est vivante \ active ...
la source