2010-10-13 8 views
7

Sieht aus wie andere dieses Problem hatten, aber ich kann nicht scheinen, eine Lösung zu finden.DefaultModelBinder nicht verbindlich geschachteltes Modell

Ich habe 2 Modelle: Person & BillingInfo:

public class Person 
{ 
public string Name { get; set;} 
public BillingInfo BillingInfo { get; set; } 
} 

public class BillingInfo 
{ 
public string BillingName { get; set; } 
} 

Und ich versuche, diese direkt in meine Aktion zu binden, um die Default verwenden.

public ActionResult DoStuff(Person model) 
{ 
// do stuff 
} 

Während die Person.Name -Eigenschaft festgelegt ist, ist die BillingInfo immer Null.

Mein Beitrag sieht wie folgt aus:

"Name = statichippo & BillingInfo.BillingName = statichippo"

Warum ist BillingInfo immer null?

Antwort

5

Status keine Repro. Ihr Problem ist woanders und kann nicht feststellen, woher Sie das als Information erhalten haben. Das standardmäßige Modellbinderprogramm funktioniert perfekt mit verschachtelten Klassen. Ich habe es unendlich oft benutzt und es hat immer funktioniert.

Modell:

public class Person 
{ 
    public string Name { get; set; } 
    public BillingInfo BillingInfo { get; set; } 
} 

public class BillingInfo 
{ 
    public string BillingName { get; set; } 
} 

Controller:

[HandleError] 
public class HomeController : Controller 
{ 
    public ActionResult Index() 
    { 
     var model = new Person 
     { 
      Name = "statichippo", 
      BillingInfo = new BillingInfo 
      { 
       BillingName = "statichippo" 
      } 
     }; 
     return View(model); 
    } 

    [HttpPost] 
    public ActionResult Index(Person model) 
    { 
     return View(model); 
    } 
} 

Ausblick:

<% using (Html.BeginForm()) { %> 
    Name: <%: Html.EditorFor(x => x.Name) %> 
    <br/> 
    BillingName: <%: Html.EditorFor(x => x.BillingInfo.BillingName) %> 
    <input type="submit" value="OK" /> 
<% } %> 

Posted Werte: Name=statichippo&BillingInfo.BillingName=statichippo perfekt in der POST-Aktion gebunden. Das Gleiche funktioniert auch mit GET.


Ein möglicher Fall, wenn dies funktionieren könnte nicht ist folgende:

public ActionResult Index(Person billingInfo) 
{ 
    return View(); 
} 

Beachten Sie, wie die Aktionsparameter billingInfo, denselben Namen wie die BillingInfo Eigenschaft genannt wird. Stellen Sie sicher, dass dies nicht Ihr Fall ist.

+0

Du hast Recht. Stellt sich heraus mein HTML hatte ein Problem und gab aus: – hackerhasid

+0

vorzeitige Eingabe;) - "Name = statichippo & BillingInfo = & BillingInfo.BillingName = statichippo" – hackerhasid

+0

Ich hatte das gleiche Problem mit einem verschachtelten Typ nicht binded. Es stellte sich heraus, dass ich auch Probleme mit meinem HTML hatte. Ich hatte 2 Radiobuttons, deren Name mit dem Eigenschaftsnamen meines Ansichtsmodells identisch war. Optionsfeldwerte werden ebenfalls veröffentlicht, sodass der Standardmodellbinder durcheinander geraten ist. –

0
public class MyNestedClass 
{ 
    public string Email { get; set; } 
} 

public class LoginModel 
{ 
//If you name the property as 'xmodel'(other than 'model' then it is working ok. 
public MyNestedClass xmodel {get; set;} 

//If you name the property as 'model', then is not working 
public MyNestedClass model {get; set;} 

public string Test { get; set; } 
} 

Ich hatte das ähnliche Problem. Ich verbrachte viele Stunden und finde das Problem zufällig, dass ich nicht ‚Modell‘ für die Eigenschaftsnamen

@Html.TextBoxFor(m => m.xmodel.Email) //This is OK 
@Html.TextBoxFor(m => m.model.Email) //This is not OK 
6

ich dieses Problem hatte, und die Antwort starrt mich für ein paar Stunden in dem Gesicht verwendet werden soll. Ich nehme es hier auf, weil ich nach geschachtelten Modellen suchte, die nicht bindend waren und zu dieser Antwort kamen.

Stellen Sie sicher, dass die Eigenschaften Ihres geschachtelten Modells wie die Modelle, für die die Bindung funktionieren soll, über die richtigen Zugriffsmethoden verfügen.

// Will not bind! 
    public string Address1; 
    public string Address2; 
    public string Address3; 
    public string Address4; 
    public string Address5; 


    // Will bind 
    public string Address1 { get; set; } 
    public string Address2 { get; set; } 
    public string Address3 { get; set; } 
    public string Address4 { get; set; } 
    public string Address5 { get; set; } 
+0

Ich überprüfte und meine Viewmodels fehlten auch {get; einstellen; } - Es gibt eine Art von Blindheit, die uns daran hindert, dies zu sehen! – niico

0

ich hatte das gleiche Problem, hatte der bisherige Entwickler an dem Projekt das Grundstück mit einem privaten Setter registriert, als er dieses Viewmodel in einem Postbacks nicht verwendet wurde.Etwas wie folgt aus:

public MyViewModel NestedModel { get; private set; } 

dazu geändert:

public MyViewModel NestedModel { get; set; } 
1

Dies ist, was für mich gearbeitet.

ich dies geändert:

[HttpPost] 
    public ActionResult Index(Person model) 
    { 
     return View(model); 
    } 

An:

[HttpPost] 
    public ActionResult Index(FormCollection fc) 
    { 
     Person model = new Person(); 
     model.BillingInfo.BillingName = fc["BillingInfo.BillingName"] 

     /// Add more lines to complete all properties of model as necessary. 

     return View(model); 
    } 
+0

Arbeitete auch für mich. Danke für diese Lösung. – Sam

Verwandte Themen