Modellbindung funktioniert nicht

7

Ich habe die folgenden POCO-Klassen:

%Vor%

Und eine View Model Class

%Vor%

Innerhalb meiner Create Form habe ich das Modell als

definiert %Vor%

Und haben Felder wie die folgenden:

%Vor%

In meinem Controller, um den POST zu verwalten, habe ich

%Vor%

Das Problem ist, dass ich ein Location-Objekt habe, aber keine der Eigenschaften auf die im Formular eingegebenen Werte eingestellt werden soll.

Tue ich hier etwas falsch?

Danke

    
Mike 24.05.2012, 19:16
quelle

8 Antworten

38

Hier ist das Problem:

%Vor%

Siehst du es? Es ist der Name Ihres Aktionsarguments: location .

Sehen Sie sich jetzt Ihr Ansichtsmodell an, es hat eine Eigenschaft namens Location :

%Vor%

Dies verwirrt den Modellbinder. Es weiß nicht mehr, ob Sie das LocationViewModel oder seine Eigenschaft binden müssen.

So einfach umbenennen, um den Konflikt zu vermeiden:

%Vor%     
Darin Dimitrov 25.05.2012, 06:25
quelle
30

Nur um einen anderen möglichen Grund hinzuzufügen: Ich habe ein paar Stunden damit verbracht, nach einem Fehler in meinem Code zu suchen, und der Grund dafür, dass der Binder in meinem Fall nicht funktionierte, war ein Modell mit öffentlichen Feldern anstelle von öffentlichen Eigenschaften:

%Vor%

und es sollte sein:

%Vor%

Seit 3 ​​Jahren arbeite ich an ASP.NET MVC und ich bin nie zuvor darauf gestoßen. Hoffe es rettet jemanden Frust;)

    
Grzegorz 15.05.2013 08:15
quelle
4

Auch spät, um der Partei beizutreten, aber nach 3 Jahren asp.net mvc, bin ich darauf gestoßen, dass deaktivierte Eingaben nicht gepostet werden, so dass das Modellbinder sie natürlich nicht binden kann. Siehe hier :

  

"Deaktivierte Elemente in einem Formular werden nicht gesendet".

Verwenden Sie readonly="readonly" besser als deaktiviert. Siehe hier .

    
ilans 05.09.2015 05:44
quelle
2

Lassen Sie mich hier einen weiteren Grund hinzufügen, warum der Modellbinder nicht richtig funktioniert.

Ich hatte ein Modell mit der Eigenschaft ContactPhone , irgendwo auf dem Weg, den ich entschied, den Namen dieser Eigenschaft in Phone zu ändern, hörte die Modellbindung für diese Eigenschaft plötzlich auf zu arbeiten, als ich versuchte zu erstellen eine neue Instanz.

Das Problem lag in der Aktion Create in meinem Controller. Ich habe das standardmäßige Visual Studio-Gerüst verwendet und dabei die Methodensignatur erstellt:

%Vor%

Achten Sie auf das Attribut Bind , der Gerüstbauer hat die Felder mit dem ursprünglichen Namen ContactPhone erstellt, und da dies eine Zeichenfolge ist, wurde sie nicht refaktoriert. Da das neue Feld Phone nicht eingeschlossen wurde, wurde sein Wert vom Modellbinder ignoriert.

Ich hoffe, das spart jemand Zeit.

Viel Glück!

    
Anderson Fortaleza 04.07.2014 22:47
quelle
1

Und noch ein Grund: Normalerweise verwende ich die eingebauten Editoren oder Displays für und hätte dieses Problem nie gehabt. In diesem Fall benötigte ich jedoch ein semi-benutzerdefiniertes Steuerelement. Grundsätzlich ein Dropdown mit vielen Datenattributen zu den Optionen.

Was ich getan habe, für mein select-Tag war:

%Vor%

Jetzt wurde alles zurück geschrieben und für das ungeschulte Auge sah es so aus, als ob alles funktionieren und binden sollte. Der IdFor-Helfer rendert jedoch Untermodelle mit einem Unterstrich. Der Modellbinder interpretiert Unterstriche nicht als Klassenhierarchiekennzeichen. Was sie trennen sollte, ist ein Punkt. Was kommt von NameFor:

%Vor%

NameFor alle meine Probleme behoben.

    
Tod 11.08.2016 10:29
quelle
0

Das hat meinen Tag gerettet. Iad das folgende:

%Vor%

ConclusionView hat eine Eigenschaft namens Conclusion , so dass ich fast den Verstand verloren hätte.

    
ntombela 18.04.2013 09:24
quelle
0

Ich weiß, dass es zu spät ist, dies zu kommentieren. Was ich getan habe, ist ein Parameter weniger Konstruktor im ViewModel und alles hat super funktioniert.

    
Passenger 23.05.2015 19:19
quelle
0

Um noch einmal zu wiederholen, was Tod gesagt hat, benötigt das Modellbinder für die Zuordnung der Eigenschaften ein 'name'-Attribut für das HTML-Element. Ich machte eine schnelle Testform von Hand und benutzte nur das "id" -Attribut, um meine Elemente zu identifizieren.

Beim Hinzufügen des Attributs 'name' ist alles in Ordnung.

%Vor%     
Fjarskiptagervitungl 26.06.2017 09:52
quelle

Tags und Links