Ich habe zwei ViewModels (vereinfacht):
%Vor%Und die folgende Controller-Post-Aktion:
%Vor%Jetzt sende ich die folgenden Formularwerte in einem Postanforderungshauptteil an die URL, die dieser Aktion entspricht (manuell in Fiddler Request Builder):
Inhalt.Name1 = X
Dies funktioniert einwandfrei, die Name1
Eigenschaft ist in viewModel.Content
, Name2
ist null
und der Modellstatus ist ungültig, weil Name2
benötigt wird. Daher schlägt die Validierung wie erwartet fehl.
Xontent.Name1 = X oder Name1 = X oder was auch immer, damit nichts an die viewModel
Jetzt ist viewModel.Content
nicht null
(weil ich es im Konstruktor instanziiere), aber alle Eigenschaften Name1
und Name2
sind null
. Dies wird erwartet. Was ich nicht erwartet habe, ist, dass der Modellzustand gültig ist, also besteht er die Validierung (die später zu DB-Ausnahmen führt, da es keine nullbaren Spalten gibt).
Wie kann ich diesen Code verbessern, damit die Validierung auch im zweiten Fall funktioniert?
Ich habe drei Experimente gemacht:
Ich habe die Instanziierung von Content
im Konstruktor ParentViewModel
entfernt, dann ist Content
im zweiten Beispiel oben null
, aber die Validierung läuft noch.
Ich habe der Eigenschaft [Required]
ein Content
-Attribut hinzugefügt (aber nicht die Instanziierung von Content
im Konstruktor ParentViewModel
entfernt). Dies hat keinerlei Auswirkungen, das beschriebene Verhalten der beiden obigen Tests ist das gleiche.
Ich habe der [Required]
-Eigenschaft ein Content
-Attribut hinzugefügt und die Instanziierung von Content
im ParentViewModel
-Konstruktor entfernt. Das scheint so zu funktionieren, wie ich es möchte: Im zweiten Test ist Content
null
und die Validierung schlägt aufgrund des [Required]
-Attributs fehl. Es würde so aussehen:
Ich würde jetzt schließen, dass das Instanziieren der Content
untergeordneten Eigenschaft im Konstruktor ParentViewModel
die Ursache des Problems ist und dass der Modellbinder selbst die untergeordneten Eigenschaften instanziieren muss (oder nicht, wenn keine übereinstimmenden Formularfelder vorhanden sind) die Anfrage), um eine funktionierende serverseitige Validierung zu erhalten.
Ich habe Kind-Eigenschaftsinstanziierung in mehreren anderen Ansichtsmodellkonstruktoren und habe dieses Problem bis jetzt nicht bemerkt. Also, ist das generell eine schlechte Übung? Gibt es andere Möglichkeiten, das Problem zu lösen?
ModelState.IsValid teilt Ihnen mit, ob Modellfehler zu Modellfehlern hinzugefügt wurden.
Der Standardmodellbinder fügt einige Fehler bei grundlegenden Konvertierungsproblemen hinzu, wie z. B. die Übergabe einer Nicht-Nummer für etwas, das ein "int" ist. Sie können ModelState basierend auf dem von Ihnen verwendeten Validierungssystem vollständiger auffüllen. Ich würde vorschlagen, in Datenannotationen zu schauen, um die ViewModels zu validieren, da es gut funktioniert.
Diese Syntax kann falsch oder alt sein. ModelState.AddModelError ("Schlüssel", Ausnahme)
umschrieben von Was ist ModelState.IsValid, das für in gültig ist? ASP.NET MVC in NerdDinner?
Tags und Links asp.net-mvc asp.net-mvc-3 asp.net validation