80 votes

MVC3 Supprimer les erreurs de ModelState

J'ai une situation où j'upload une image sélectionnée par l'utilisateur à partir de son système de fichiers local. Mon Formulaire dans mon point de vue, il a essentiellement deux boutons submit. L'un est utilisé pour Soumettre le formulaire normalement, et toute la validation s'exécute. Le 2ème est uniquement pour le chargement de l'image, dans ce cas, je ne veux pas valider encore.

J'ai réussi à désactiver la validation Côté Client en lui donnant ma "Upload Image" bouton soumettre une une valeur de classe de "style-name annuler" , de sorte

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

Maintenant, quand je poste arrière, mon modèle a une propriété UploadImageButton, lorsque ce bouton est cliqué, il remplit cette propriété de (Nom de l'entrée correspond à la Propriété). De cette façon, je sais pas si le formulaire a été envoyé par mon vrai bouton Soumettre ou par le UploadImageButton.

Ma question est la suivante... Comment puis-je désactiver ServerSide de validation? Je ne veux pas le Résumé de Validation info montrant lorsque l'utilisateur clique sur ce bouton. Je sais que vous pouvez ajouter des erreurs de modèle à l'aide de cette

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

Je suis à la recherche d'un moyen de Supprimer des Erreurs de Modèle. Est-ce possible?

EDIT:

Voici ce que j'ai trouvé:

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
}

138voto

bbak Points 976

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

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

64voto

Dan Friedman Points 840

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

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

7voto

Mahmoodvcs Points 956

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.

6voto

James Points 131

En général, vous ne voulez pas désactiver la validation côté serveur ou supprimer ModelState manuelle des erreurs. C'est faisable, mais sujettes à l'erreur, car il faut compter sur les chaînes de caractères comme des clés. Je upvoted la réponse sur comment faire pour supprimer les clés, car il est juste et utile, mais je recommande à l'encontre de la conception de vous-même dans les cas où vous devez sérieusement envisager.

Dans votre cas, vous avez plusieurs boutons de soumission pour la même forme, mais vous n'êtes pas vraiment la soumission du formulaire, lorsque vous télécharger l'image. Pour empêcher la validation côté client, vous pouvez utiliser le bouton "annuler" de la classe que vous l'avons déjà indiqué, mais je recommande aussi d'avoir le 2ème bouton de soumission sous une forme différente, auquel cas elle ne provoque pas de validation de votre formulaire principal.

Il y a un deuxième avantage de l'utilisation de la forme différente: vous pouvez l'envoyer à un autre ActionResult méthode qui serait juste gérer la logique de téléchargement de l'image. Cette méthode ne serait tout simplement pas la peine de cocher la case "IsValid" propriété du modèle de l'état: il ne se soucie si il ya des informations dans l'image, et qui peut être enregistré séparément. (Même si vous utilisez le même ActionResult méthode, vous pouvez l'entonnoir de la logique, de sorte que vous ne comptez pas sur la propriété IsValid du modèle d'état.)

Si vous devez effacer les erreurs du modèle de l'état, et il est logique d'effacer tous les d'eux, essayez ceci:

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

Ceci vous permet de ne en fonction sur l'obtention de la clé de noms de corriger, mais conserve les valeurs de toutes les valeurs (valides ou non) 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 dans la vue, ce qui ne sera pas causer la validation côté client (ils ne sont pas dans la vue), mais faire suite à la validation côté serveur des questions. Dans ce cas, il est préférable d'utiliser @Html.HiddenFor(modèle => modèle.PropertyName, si vous le pouvez, en supposant que la valeur a déjà été défini, il n'est tout simplement pas visible dans la vue.

-3voto

AgentFire Points 3818

Je ne souhaite pas que les informations du résumé de validation s'affichent lorsque l'utilisateur clique sur ce bouton

Ensuite, supprimez simplement la ligne de code @Html.ValidationSummary(); de votre vue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X