Ich checke meine Datenbank ein, Create(FooViewModel fvm){...}
um festzustellen, ob die fvm.prop1
und fvm.prop2
bereits in dieser Kombination vorhanden sind. Wenn ja, möchte ich dem Modellstatus einen Fehler hinzufügen und dann die gesamte Ansicht zurückgeben. Ich habe es versucht:
public ActionResult Create(FooViewModel fvm){
if (ThatComboAlreadyExists(fvm)) {
ModelState.AddModelError("Model", "There is already one like that");
return View(fvm);
}
}
... aber ich bekomme keine Anzeige von Fehlern in der Html.ValidationSummary
, wo ich annehme, dass sie erscheinen würden. Ich habe den Verdacht, dass "Model" nicht der richtige Schlüssel ist, aber ich konnte nichts a la Google finden.
asp.net-mvc-2
asp.net-mvc-2-validation
modelstate
Scott Baker
quelle
quelle
Antworten:
Ich bin schließlich auf ein Beispiel für die Verwendung gestoßen, nach der ich gesucht habe - um dem Modell im Allgemeinen einen Fehler zuzuweisen, anstatt einer seiner Eigenschaften, wie Sie es normalerweise nennen:
Verwenden Sie jedoch eine leere Zeichenfolge für den Schlüssel:
Die Fehlermeldung wird
<%: Html.ValidationSummary() %>
wie erwartet angezeigt.quelle
ModelState.AddError(errorMessage)
oderModelState.AddGlobalError(errorMessage)
... es wäre intuitiv und einfacher herauszufinden, wie eine Fehlermeldung hinzugefügt werden kann, die nicht mit den Eigenschaften eines Modells zusammenhängt.@Html.ValidationMessage(string.Empty)
ValidationSummaryErrors(bool excludePropertyErrors)
Überladung zeigt alle Validierungsfehler an, wenn das Argument falsch ist, oder nur nicht eigenschaftsspezifische (key = "") Fehler, wenn das Argument wahr ist.Sie können den Modellfehler für jede Eigenschaft Ihres Modells hinzufügen. Ich schlage vor, wenn nichts mit dem Erstellen einer neuen Eigenschaft zu tun hat.
Als Beispiel prüfen wir, ob die E-Mail bereits in der Datenbank verwendet wird, und fügen den Fehler der E-Mail-Eigenschaft in der Aktion hinzu. Wenn ich die Ansicht zurückgebe, wissen sie, dass ein Fehler vorliegt, und wie sie mithilfe von angezeigt werden
und
quelle
(m=>m.email).SomeMagicToString()
?nameof
in C # 6.0 kommende Operator löst dieses Problem mit magischen Zeichenfolgen. msdn.microsoft.com/en-us/magazine/dn802602.aspxDas Einfügen der Modellpunkt-Eigenschaft in Zeichenfolgen hat bei mir funktioniert:
ModelState.AddModelError("Item1.Month", "This is not a valid date");
quelle