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.

Ihre post-Methode parameter werden muss 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

Schreibe einen Kommentar