Komplexe Objekt-und Modell-binder ASP.NET MVC
Ich habe ein Modell-Objekt-Struktur mit einem Foo
- Klasse, die enthält eine Bar
mit einem string-Wert.
public class Foo
{
public Bar Bar;
}
public class Bar
{
public string Value { get; set; }
}
Und ein view-Modell verwendet, das die Struktur dieser
public class HomeModel
{
public Foo Foo;
}
Dann habe ich ein Formular in der Ansicht, dass in Razor sieht ungefähr so aus.
<body>
<div>
@using (Html.BeginForm("Save", "Home", FormMethod.Post))
{
<fieldset>
@Html.TextBoxFor(m => m.Foo.Bar.Value)
<input type="submit" value="Send"/>
</fieldset>
}
</div>
</body>
In html, das wird.
<form action="/Home/Save" method="post">
<fieldset>
<input id="Foo_Bar_Value" name="Foo.Bar.Value" type="text" value="Test">
<input type="submit" value="Send">
</fieldset>
</form>
Schließlich die controller behandeln die post loos wie dieser
[HttpPost]
public ActionResult Save(Foo foo)
{
//Magic happends here
return RedirectToAction("Index");
}
Mein problem ist, dass Bar
im Foo
ist null
einmal trifft es die Save
controller-Aktion (Foo
erstellt, aber mit einem null
Bar
Feld).
Ich dachte, der binder Modell in MVC wäre in der Lage zu schaffen, die Foo
und die Bar
Objekt und stellen Sie die Value
Eigentum, solange es aussieht wie die oben. Was bin ich?
Weiß ich auch, meiner Ansicht Modell ist ein wenig kompliziert und könnte einfacher sein, aber ich für das, was ich versuche zu tun, ich würde mir wirklich helfen wenn ich könnte die tiefere Objekt-Struktur. Die obigen Beispiele verwendet ASP.NET 5.
HomeModel
oder Sie brauchen, um die [Bind(Prefix="foo")]
Attribut. Aber Sie sollten nie Namen ein parameter in einer ActionResult
Methode mit dem gleichen Namen wie eine Modell-Eigenschaft (binding fehlschlagen)danke für die Antwort. Ich habe jedoch ändern, erhalten
HomeModel
im Save
Aktion und verändert die parameter Namen - aber immer noch ein leeres Objekt Foo ...Das ist, weil Ihr ein Feld, nicht eine Eigenschaft. Fügen Sie die getter-und setter -:)
verdammt ... ich dachte, ich könnte Felder verwenden ... und nicht Ereignis denken zu ändern ... Danke! Ändern Sie einfach Ihren Kommentar zu einem post, wenn Sie wollen die Punkte.
vielen Dank, dass Sie ein einfaches Beispiel. Ich muss gestehen, ich bin immer verärgert darüber, wie oft passiert das umgekehrte (das ist rein der Fragesteller die Schuld natürlich). Tut mir Leid, wenn das ist ein meta-Hinweis, aber nach waten durch so viele Gegenteil aufgebläht Beispiele auf diese Frage, es war erfrischend.
InformationsquelleAutor Riri | 2015-01-29
Du musst angemeldet sein, um einen Kommentar abzugeben.
Erstens, die
DefaultModelBinder
wird nicht binden Felder, so müssen Sie EigenschaftenZweitens, die Helfer bei der Generierung von Steuerelementen basierend auf
HomeModel
aber Sie veröffentlichen Sie zurück zuFoo
. Entweder ändern Sie die POST-Methodeoder verwenden Sie den
BindAttribute
angeben, diePrefix
(die Streifen im wesentlichen den Wert des Präfix von der gebuchten Werte - soFoo.Bar.Value
wirdBar.Value
für die Zwecke der Bindung)Beachten Sie auch, dass Sie, sollten Sie nicht den Namen der Methode, die parameter mit dem gleichen Namen wie eine Ihrer Eigenschaften, die sonst verbindlich wird scheitern, und dein Modell wird null sein.
Dass Sie mit der rechten seine frustrierend und nicht offensichtlich, aber es gibt wirklich keine Möglichkeit, dies zu überwinden, weil die Art und Weise Modell-Bindung funktioniert. Das tatsächliche Verhalten erklärt sich in ein bisschen mehr detail in diese Antwort. Seine schade, dass Ihr nicht besser dokumentiert.
Zog mein Haar für die letzten paar Stunden über die Eigenschaften vs Felder gotcha. Ich kann nicht glauben, es war etwas so einfach. uggggggh
InformationsquelleAutor
Ich gerade entdeckt, ein weiterer Grund, warum dies passieren kann, ist, wenn Ihre Eigenschaft benannt ist
Settings
! Betrachten Sie die folgende Ansicht Modell:In code, wenn Sie eine Bindung an die
Settings
Eigentum, schlägt Sie zu binden (nicht nur post, sondern auch auf die Erzeugung der form). Wenn Sie umbenennenSettings
zuDSettings
(etc), dass es plötzlich wieder funktioniert.InformationsquelleAutor Nicholas Petersen
Ich hatte das gleiche problem und nach folgte ich @Stephen Muecke Schritte, die ich erkannte, dass das problem verursacht wurde, da meine Eingaben deaktiviert wurden (ich war deaktivieren Sie mit JQuery auf Dokument bereit) wie Sie sehen können gibt es hier: Wie kann ich Einreichen, deaktiviert Eingabe in ASP.NET MVC?. Am Ende verwendete ich-lese-nur anstelle von disabled-Attribut und alle Werte gesendet wurden erfolgreich an den controller.
InformationsquelleAutor joalcego
Ich hatte das gleiche problem, aber sobald ich Sie erstellt ein VERSTECKTES FELD für die foreign-key...alles funktioniert einwandfrei...
FORM BEISPIEL:
AKTION BEISPIEL:
SCHÖNE BILDER:
InformationsquelleAutor Prisoner ZERO