ASP.Net MVC - Modell mit Sammlung, die nicht auf Postback auffüllt

9

Ich habe eine ASP.Net MVC-Anwendung mit einem Modell, das mehrere Ebenen tief ist und eine Sammlung enthält.

Ich glaube, dass die Ansicht zum Erstellen der Objekte korrekt eingerichtet ist, aber sie füllt die Auflistung innerhalb des Modells nicht aus, wenn ich das Formular auf dem Server ablege.

Ich habe ein Stück Daten, das so in der Klassenhierarchie gefunden wird:

%Vor%

Diese Klassenstruktur wird von LinqToSQL erstellt, und ContactInformation hat den Typ EntitySet<ContactData> . Um die Ansicht zu erstellen, überlasse ich folgendes:

%Vor%

und innerhalb der Ansicht habe ich ein Formular, das ein einzelnes Textfeld mit einem Namen enthält, der dem oben genannten Feld zugeordnet ist:

%Vor%

Die post-Methode in meinem Controller ist dann wie folgt:

%Vor%

Es ist an diesem Punkt, wo ich als Person verloren bin.PersonDetails.ContactInformation.Count () == 0. Der ModelBinder hat also ein ContactInformation-Objekt erstellt aber nicht mit dem Objekt gefüllt, das es (Index) bei Index 0 enthalten sollte (z. B. ContactData).

Meine Frage ist zweifach: 1. Habe ich den richtigen Ansatz gewählt, d. H. Sollte das funktionieren? 2. Irgendwelche Ideen, warum es nicht möglich ist, das ContactInformation-Objekt zu füllen?

Vielen Dank, Richard

    
Richbits 20.05.2009, 11:59
quelle

6 Antworten

20

Ich denke, dass Ihr Modell zu komplex ist, um mit dem Standardmodellbinder zu arbeiten. Sie könnten versuchen, mehrere Parameter zu verwenden und sie mit Präfixen zu binden:

%Vor%

Oder Sie könnten Ihre eigenen benutzerdefinierten Modellbinder entwickeln, die verstehen, wie Sie Ihr komplexes Modell aus den Formulareingaben ableiten.

    
tvanfosson 20.05.2009, 12:18
quelle
5

Wenn eine Eigenschaft null ist, konnte der Modellbinder other sie nicht finden oder konnte keine Werte im übermittelten Formular finden, die für eine Instanz des Typs der Eigenschaft erforderlich sind. Wenn die Eigenschaft beispielsweise eine nicht nullfähige ID hat und Ihr Formular keine Daten für diese ID enthält, behält das Modellbinder die Eigenschaft als null, da es keine neue Instanz des Typs erstellen kann, ohne die ID zu kennen.

Mit anderen Worten, um dieses Problem zu diagnostizieren, müssen Sie die Daten im übermittelten Formular (das ist bei Firebug oder Fiddler leicht zu sehen) mit der Struktur des Objekts vergleichen, das Sie erwarten, dass der Modellbinder gefüllt wird. Wenn erforderliche Felder fehlen oder wenn die Werte so übergeben werden, dass sie nicht in den Typ eines erforderlichen Feldes konvertiert werden können, wird das gesamte Objekt auf Null gesetzt.

    
Craig Stuntz 20.05.2009 12:38
quelle
1

Ich habe mit dieser Art von Szenario gekämpft und bin schließlich zu der Erkenntnis gelangt, dass das zugrunde liegende Problem darin besteht, dass der MVC-Standardmodellbinder nicht auf EntitySet & lt; T & gt; Felder, nur Liste & lt; T & gt; Felder. Ich habe jedoch eine einfache Problemumgehung gefunden, die akzeptabel scheint. In meinem Fall habe ich eine Company-Entität, die eine Beziehung von eins zu viele zu Contacts hat (mein Linq-zu-Sql-EntitySet).

Da es so aussieht, als wenn ich meinen Code von EntitySet & lt; Contact & gt; zu List & lt; Contact & gt ;, der MVC-Standardmodellbinder startet wie erwartet zu arbeiten (obwohl der LTS nicht jetzt ist), ich dachte, ich würde eine alternative, "Alias" -Eigenschaft zu MVC vom Typ List & lt; Contact & gt; das scheint zu funktionieren.

In meiner Firmenentitätsklasse:

%Vor%

Also jetzt, in meiner Ansicht, habe ich folgendes:

%pr_e%

Scheint wie ein Zauber zu funktionieren!

Viel Glück! -Mike

    
Funka 22.05.2009 03:34
quelle
0

Vielleicht ist das Fehlen des Bindungsattributs der Fall:

%Vor%     
Arnis Lapsa 20.05.2009 12:05
quelle
0

Das erste Argument von Html.TextBox ist der Name des Textfelds, das zweite Argument ist der Wert.

"Falsch":

%Vor%

"Richtig":

%Vor%     
Ropstah 20.05.2009 12:10
quelle
0

Stellen Sie sicher, dass Ihre Modelle (und alle verschachtelten Modelle) Eigenschaften (Getter / Setter) anstelle von Feldern verwenden. Anscheinend benötigt der Standardordner Eigenschaften, um ordnungsgemäß zu funktionieren. Ich hatte eine sehr ähnliche Situation, die durch Ändern der erforderlichen Felder in Eigenschaften behoben wurde.

    
ATD 10.02.2016 21:30
quelle

Tags und Links