MVC3 Supprimer les erreurs ModelState

J’ai une situation où je télécharge une image que l’utilisateur a sélectionnée dans son système de fichiers local. Mon formulaire à mon avis a essentiellement deux boutons d’envoi. L’un est utilisé pour soumettre le formulaire normalement, et toutes les validations sont exécutées. Le second est uniquement pour le téléchargement de l’image, auquel cas je ne veux pas encore valider.

J’ai réussi à désactiver la validation côté client en donnant à mon bouton d’envoi «Upload Image» une valeur de classe «style-name cancel».

 

Maintenant, lorsque je publie, mon modèle a une propriété UploadImageButton, lorsque ce bouton est cliqué, il remplit cette propriété (Nom de l’entrée correspond à la propriété). De cette façon, je sais si le formulaire a été soumis par mon véritable bouton Soumettre ou par le bouton UploadImageButton.

Ma question est la suivante … Comment puis-je désactiver la validation ServerSide? Je ne souhaite pas que les informations de résumé de validation apparaissent lorsque l’utilisateur clique sur ce bouton. Je sais que vous pouvez append des erreurs de modèle personnalisé en utilisant cette

 ModelState.AddModelError("{key}", "{error msg}"); 

Je cherche un moyen de supprimer les erreurs de modèle. Est-ce possible?

MODIFIER:

Voici ce que j’ai imaginé:

 foreach (var key in ModelState.Keys.ToList().Where(key => ModelState.ContainsKey(key))) { //ModelState.Remove(key); //This was my solution before ModelState[key].Errors.Clear(); //This is my new solution. Thanks bbak } 

Vous pouvez supprimer les erreurs de modèle en procédant comme suit:

 if (ModelState.ContainsKey("{key}")) ModelState["{key}"].Errors.Clear(); 

Cela complète les réponses précédentes, mais le simplifie un peu plus:

 foreach (var modelValue in ModelState.Values) { modelValue.Errors.Clear(); } 

En général, vous ne souhaitez pas désactiver la validation côté serveur ni supprimer manuellement les erreurs ModelState. C’est faisable, mais sujet aux erreurs car il doit s’appuyer sur des chaînes comme clés. J’ai soulevé la réponse sur la façon de supprimer les clés, car elle est correcte et utile, mais je recommande de ne pas vous concevoir dans un cas où vous devez le considérer sérieusement.

Dans votre cas, vous avez plusieurs boutons d’envoi pour le même formulaire, mais vous n’envoyez pas vraiment le formulaire lorsque vous téléchargez l’image. Pour empêcher la validation côté client, vous pouvez utiliser la classe “cancel” comme vous l’avez déjà indiqué, mais je vous recommande également d’avoir le deuxième bouton d’envoi sous une forme différente, auquel cas il ne validera pas votre formulaire principal.

Il existe un deuxième avantage à utiliser la forme différente: vous pouvez l’envoyer à une autre méthode ActionResult qui ne ferait que gérer la logique du téléchargement de l’image. Cette méthode différente ne suffirait pas à vérifier la propriété “IsValid” de l’état du modèle: elle se soucie uniquement de la présence d’informations dans l’image et peut être vérifiée séparément. (Même si vous utilisez la même méthode ActionResult, vous pouvez canaliser la logique afin de ne pas vous fier à la propriété IsValid de l’état du modèle.)

Si vous devez effacer les erreurs de l’état du modèle et qu’il est logique de les supprimer toutes, essayez ceci:

 foreach (var key in ModelState.Keys) { ModelState[key].Errors.Clear(); } 

Cela vous empêche de choisir les noms de clé corrects, mais conserve les valeurs si des valeurs (valides ou non valides) existent déjà dans le modèle.

Une dernière chose à vérifier dans ces cas est de savoir si vous avez des valeurs qui ne sont parfois que dans la vue, ce qui ne provoque pas de validation côté client (elles ne sont pas dans la vue), mais entraîne des problèmes de validation côté serveur. Dans ce cas, il est préférable d’utiliser @ Html.HiddenFor (model => model.PropertyName, si vous le pouvez, en supposant que la valeur a déjà été définie, elle n’est simplement pas visible dans cette vue.

Je l’utilise parfois, alors j’ai développé une méthode d’extension:

 public static ModelStateDictionary ClearError(this ModelStateDictionary m, ssortingng fieldName) { if (m.ContainsKey(fieldName)) m[fieldName].Errors.Clear(); return m; } 

Il peut être utilisé couramment pour effacer des erreurs pour plusieurs champs.