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
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
:
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%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;)
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 .
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:
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!
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.
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%Tags und Links asp.net-mvc asp.net-mvc-3