Validierung verschachtelter ViewModels

8

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

    gebunden wird

    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:

    %Vor%

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?

    
Slauma 29.11.2011, 22:10
quelle

2 Antworten

0

Die dritte Lösung ist in Ordnung:

%Vor%

Ich benutze es jetzt an mehreren Stellen und habe keine Probleme bemerkt.

    
Slauma 18.01.2013, 15:54
quelle
0

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?

    
William 29.11.2011 22:16
quelle