211 votes

ModelState.AddModelError - Comment ajouter une erreur qui ne concerne pas une propriété ?

Je vérifie ma base de données dans Create(FooViewModel fvm){...} pour voir si le fvm.prop1 y fvm.prop2 existe déjà dans cette combinaison ; si c'est le cas, je veux ajouter une erreur au modelstate, puis retourner la vue entière. J'ai essayé :

public ActionResult Create(FooViewModel fvm){
    if (ThatComboAlreadyExists(fvm)) {
      ModelState.AddModelError("Model", "There is already one like that");
      return View(fvm);
    }
}

...mais je n'obtiens pas d'affichage d'erreurs dans le fichier Html.ValidationSummary qui est l'endroit où je suppose qu'ils apparaissent. Je soupçonne que "Modèle" n'est pas la bonne clé, mais je n'ai rien trouvé à la Google.

0 votes

366voto

ScottSEA Points 2978

Je suis finalement tombé sur un exemple de l'utilisation que je recherchais - pour attribuer une erreur au modèle en général, plutôt qu'à l'une de ses propriétés, comme vous le faites habituellement :

ModelState.AddModelError(string key, string errorMessage);

mais utilisez une chaîne vide pour la clé :

ModelState.AddModelError(string.Empty, "There is something wrong with Foo.");

Le message d'erreur se présentera dans le <%: Html.ValidationSummary() %> comme on peut s'y attendre.

35 votes

Ce cas me fait penser : Pourquoi il n'y a pas une méthode comme ModelState.AddError(errorMessage) o ModelState.AddGlobalError(errorMessage) ... il serait intuitif et plus facile de trouver comment ajouter un message d'erreur non lié aux propriétés d'un modèle.

2 votes

@Rubens : C'est vrai, mais vous pouvez facilement ajouter une telle méthode avec des méthodes d'extension.

4 votes

Vous pouvez également afficher l'erreur en utilisant @Html.ValidationMessage(string.Empty)

28voto

VinnyG Points 2996

Vous pouvez ajouter l'erreur de modèle sur n'importe quelle propriété de votre modèle, je suggère s'il n'y a rien de lié de créer une nouvelle propriété.

Par exemple, nous vérifions si l'adresse électronique est déjà utilisée dans la base de données et nous ajoutons l'erreur à la propriété Email de l'action. Ainsi, lorsque je renvoie la vue, elle sait qu'il y a une erreur et comment l'afficher en utilisant la méthode suivante

<%: Html.ValidationSummary(true)%>
<%: Html.ValidationMessageFor(model => model.Email) %>

y

ModelState.AddModelError("Email", Resources.EmailInUse);

1 votes

Cela semble contre-intuitif dans mon cas - je vérifie si une combinaison particulière de col1 et col2 existe déjà dans la base de données, donc il ne semble pas juste d'avoir la propriété IsDuplicateOfAnotherRow sur mon ViewModel. Il s'avère que vous pouvez ajouter une erreur à votre modèle - voir ma réponse.

1 votes

Existe-t-il un moyen d'obtenir la chaîne "Email" pour AddModelError sans utiliser une chaîne littérale fragile ? Comme (m=>m.email).SomeMagicToString() ?

0 votes

Je ne pense pas, il faut utiliser la ficelle magique... pas la meilleure mais quand même une bonne solution.

4voto

Chris Points 1

Mettre la propriété du point modèle dans les chaînes de caractères a fonctionné pour moi : ModelState.AddModelError("Item1.Month", "This is not a valid date");

0voto

Vivek parmar Points 1

Essayez d'utiliser la réponse ci-dessous pour obtenir un format de sortie cohérent :- new ValidationProblemDetails()

if (!ModelState.IsValid) { 
ModelState.AddModelError("ErrorKey", "ErrorValue");
return BadRequest(new ValidationProblemDetails(this.ModelState));
}

Format de sortie :

{
    "errors": {
        "ErrorKey": [
            "ErrorValue"
        ]
    },
    "title": "One or more validation errors occurred.",
    "status": 400,
}

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