Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
MVC 4 Model Binding bei Subklassen
Ahrimaan
myCSharp.de - Member



Dabei seit:
Beiträge: 363
Herkunft: Thorn

Themenstarter:

MVC 4 Model Binding bei Subklassen

beantworten | zitieren | melden

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

                                        
Dieser Beitrag wurde 2 mal editiert, zum letzten Mal von Ahrimaan am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15806
Herkunft: BW

beantworten | zitieren | melden

Ja. Subklassen funktionieren in dieser Form nicht mit MVC.
Geht nur sauber mit Workarounds (Form Index)
private Nachricht | Beiträge des Benutzers
DiViP
myCSharp.de - Member



Dabei seit:
Beiträge: 27

beantworten | zitieren | melden

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.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von DiViP am .
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15806
Herkunft: BW

beantworten | zitieren | melden

...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.
private Nachricht | Beiträge des Benutzers
Ahrimaan
myCSharp.de - Member



Dabei seit:
Beiträge: 363
Herkunft: Thorn

Themenstarter:

beantworten | zitieren | melden

Zitat von Abt
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
private Nachricht | Beiträge des Benutzers
Abt
myCSharp.de - Team

Avatar #avatar-4119.png


Dabei seit:
Beiträge: 15806
Herkunft: BW

beantworten | zitieren | melden

...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 ;-)
private Nachricht | Beiträge des Benutzers
malignate
myCSharp.de - Member

Avatar #avatar-3206.png


Dabei seit:
Beiträge: 751

beantworten | zitieren | melden

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)
private Nachricht | Beiträge des Benutzers