Laden...

MVC 4 Model Binding bei Subklassen

Erstellt von Ahrimaan vor 10 Jahren Letzter Beitrag vor 10 Jahren 1.813 Views
A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 10 Jahren
MVC 4 Model Binding bei Subklassen

Hallo zusammen,

ich habe eine Klasse X

mit dem property Address

Address ist wiederum eine Klasse mit x propertys

Ich habe nun für die Klasse Address eine PartialView geschrieben
und binde diese in einer anderen View ein.

Nun der Kruxx : Ich mache bei meiner Hauptview einen Postback mit Klasse x.
in x ist Adress vorhanden aber alle Propertys auf "null"

Irgendwie klappt das Modelbidning nicht. Hat MVC Probleme mit den Subklassen ?

Klasse Address:

[Serializable]
    public class AddressModel
    {
        public string LocationName { get; set; }
        public string Street { get; set; }
        public string Postcode { get; set; }
        public string City { get; set; }
    }
public class RequestModel
    {
        public RequestModel()
        {
            Address = new AddressModel();
        }

        public Guid Id { get; set; }
        public AddressModel Adress { get; set; }}

Die Hauptview hat das :

@Html.Partial("AdressModelControl", Model.Address)



Und die Partial View:

@model Models.AddressModel
<div class="row clearfix remove-bottom">
@Html.LabelFor(x => x.LocationName, new { @class = "two columns alpha omega label-inline" })
@Html.TextBoxFor(x => x.LocationName, new { @class = "two columns alpha omega" })
</div>
<div class="row clearfix remove-bottom">
@Html.LabelFor(x => x.Street, new { @class = "two columns alpha omega label-inline" })
@Html.TextBoxFor(x => x.Street, new { @class = "two columns alpha omega" })
</div>
<div class="row clearfix remove-bottom">
@Html.LabelFor(x => x.Postcode, new { @class = "two columns alpha omega label-inline" })
@Html.TextBoxFor(x => x.Postcode, new { @class = "one columns alpha omega" })
</div>
<div class="row clearfix remove-bottom">
@Html.LabelFor(x => x.City, new { @class = "two columns alpha omega label-inline" })
@Html.TextBoxFor(x => x.City, new { @class = "two columns alpha omega" })
</div>



Grüße
16.806 Beiträge seit 2008
vor 10 Jahren

Ja. Subklassen funktionieren in dieser Form nicht mit MVC.
Geht nur sauber mit Workarounds (Form Index)

D
27 Beiträge seit 2009
vor 10 Jahren

Schau dir mal EditorTemplates an.

Deine Partial "AdressModelControl" musst als EditorTemplate anlegen, dann kannst du in deiner View über @Html.EditorFor(x => x.Address, "AdressModelControl") diese einbinden. Damit sollte das Binding auch funktionieren.

16.806 Beiträge seit 2008
vor 10 Jahren

...das geht in den meisten Fällen nur, wenn man auch den dazugehörigen ModelBinder manipuliert - vor allem bei eigenen Datentypen; das wiederum kann Nebenwirkungen haben.

Das Binding hier wird dann über das von mir genannte Form Indexing realisiert.
Man sollte aber ohnehin mit View- und SubmitModels arbeiten, statt eine Entity an die View zu schubsen. Dann löst sich dieses Problem von alleine.

A
Ahrimaan Themenstarter:in
350 Beiträge seit 2010
vor 10 Jahren

Man sollte aber ohnehin mit View- und SubmitModels arbeiten, statt eine Entity an die View zu schubsen. Dann löst sich dieses Problem von alleine.

Das allerdings höre ich zum ersten mal.
Wie stelle ich das an ? Übergebe ich dir View 2 Models ?

Grüße

16.806 Beiträge seit 2008
vor 10 Jahren

...dann hast Du noch nie ein MVC Beitrag von mir gelesen.
Such mal hier im Forum nach SubmitModel - ich glaub, ich hab den Begriff als bisher einziger verwendet 😉

742 Beiträge seit 2005
vor 10 Jahren

Ich glaube das Problem liegt an dem PartialView, afaik gehen geschachtelte Klassen schon.

Der ModelBinder erwartet für die geschachtelten Klassen bei Binding über den Body z.B. den Key "Address.Street". Wenn du dein View ohne PartialView erstellst, z.B.


@Html.TextBoxFor(x => x.Address.Street)

bekommt das input-Element den Namen "Address.Street" und alles passt. Wegen dem PartialView entfällt aber der Prefix.

Das gleiche problem ist auch hier geschildert: http://thatextramile.be/blog/2011/01/prefixing-input-elements-of-partial-views-with-asp-net-mvc/

Lösungen:
ENTWEDER
a) Keine Partial Views verwenden
ODER
b) Eigener Helper bei dem explizit Prefix (hier "Address") angegeben werden kann.

TIPP: Wenn du auch keine Lust auf Mapping-Code (z.b. Konvertierung Model->DB-Entity) dann schau dir AutoMapper an (https://github.com/AutoMapper/AutoMapper)