web-dev-qa-db-fra.com

ModelState.AddModelError - Comment puis-je 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 fvm.prop1 et fvm.prop2 existent déjà dans cette combinaison; si tel est le cas, je souhaite ajouter une erreur à l'état de la modélisation, puis renvoyer la vue complète. 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 Html.ValidationSummary, c’est là que je suppose qu’elles apparaissent. Je soupçonne que "Modèle" n'est pas la bonne clé, mais je n'ai rien trouvé à la Google.

180
Scott Baker

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

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 la <%: Html.ValidationSummary() %> comme vous le souhaitiez.

307
Scott Baker

Vous pouvez ajouter l'erreur de modèle sur n'importe quelle propriété de votre modèle. Je suggère qu'il n'y ait rien de lié à la création d'une nouvelle propriété.

A titre d'exemple, nous vérifions si l'e-mail est déjà utilisé dans la base de données et ajoutons l'erreur à la propriété Email de l'action. Ainsi, lorsque je reviens à la vue, ils savent qu'il y a une erreur et comment l'afficher en utilisant

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

et

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

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

1
Chris