web-dev-qa-db-fra.com

MVC3 Supprimer les erreurs de ModelState

Je suis dans 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 de soumission. L'un est utilisé pour soumettre le formulaire normalement et toutes les validations sont exécutées. La seconde sert uniquement à télécharger l'image, auquel cas je ne souhaite pas valider pour le moment. 

J'ai réussi à désactiver la validation côté client en attribuant à mon bouton d'envoi "Envoyer une image" une valeur de classe "style-name cancel".

<input type="submit" name="UploadImageButton" value="Upload Image" class="style-name cancel" /> 

Désormais, lors de la publication, mon modèle a une propriété UploadImageButton. Lorsque ce bouton est cliqué, il remplit cette propriété (le nom de l'entrée correspond à la propriété). De cette façon, je sais si le formulaire a été soumis par mon vrai 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 du résumé de validation s'affichent lorsque l'utilisateur clique sur ce bouton. Je sais que vous pouvez ajouter des erreurs de modèle personnalisées à l'aide de cette option.

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

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

MODIFIER:

Voici ce que je suis venu avec:

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
}
71
Jeff Reddy

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

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

Ceci construit des réponses précédentes, mais simplifie un peu plus:

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

En général, vous ne souhaitez pas désactiver la validation côté serveur ni supprimer les erreurs ModelState manuellement. C'est faisable, mais source d'erreurs car il doit s'appuyer sur des chaînes comme clés. J'ai voté en faveur de la réponse sur la façon de retirer les clés, car elle est correcte et utile, mais je déconseille de vous placer dans une situation où vous devez l'examiner attentivement.

Dans votre cas, vous avez plusieurs boutons de soumission pour le même formulaire, mais vous ne soumettez pas 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 de placer le deuxième bouton d'envoi dans un formulaire différent, auquel cas il ne provoque aucune validation de votre formulaire principal.

L'utilisation d'un formulaire différent présente un deuxième avantage: vous pouvez l'envoyer à une méthode ActionResult différente, qui gérera simplement la logique de téléchargement de l'image. Cette méthode différente ne prend tout simplement pas la peine de vérifier la propriété "IsValid" de l'état du modèle: elle ne s'inquiète que s'il y a des informations dans l'image, et cela peut être vérifié 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 effacer toutes, essayez ceci:

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

Cela vous évite de dépendre de l'exactitude des noms de clé, mais conserve les valeurs si des valeurs (valides ou non valides) existaient 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 figurent parfois que dans la vue, ce qui ne provoquera pas de validation côté client (elles ne le 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 tout simplement pas visible dans cette vue.

6
James

Je l'utilise parfois, alors j'en ai fait une méthode d'extension:

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

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

6
Mahmoodvcs

utilisez ModelState.Remove ("{key}") pour supprimer l'erreur du modèle, ce qui réinitialisera ModelState.IsValid à true

ModelState.Remove("{key}");
0
Ibrar