2010-10-13 15 views
7

Sembra che altri abbiano avuto questo problema ma non riesco a trovare una soluzione.DefaultModelBinder non vincolante nidificato modello

Ho 2 modelli: Persona & BillingInfo:

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

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

e sto cercando di legare questo diritto nella mia azione utilizzando il DefaultModelBinder.

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

Tuttavia, mentre la proprietà Person.Name è impostata, il BillingInfo è sempre nullo.

Il mio post si presenta così:

"Name = statichippo & BillingInfo.BillingName = statichippo"

Perché BillingInfo sempre nullo?

risposta

5

Stato no repro. Il tuo problema è altrove e non è in grado di determinare da dove ciò che hai dato come informazione. Il modello predefinito di binder funziona perfettamente con le classi annidate. L'ho usato un'infinità di volte e ha sempre funzionato.

Modello:

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); 
    } 
} 

Vista:

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

valori iscritti: Name=statichippo&BillingInfo.BillingName=statichippo è perfettamente rilegato nell'azione POST. Lo stesso funziona con GET pure.


Un caso possibile quando questo non potrebbe funzionare è la seguente:

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

Notate come il parametro di azione è chiamata billingInfo, stesso nome della proprietà BillingInfo. Assicurati che non sia il tuo caso.

+0

Hai ragione. Risulta che il mio HTML ha avuto un problema ed era in uscita: – hackerhasid

+0

immissione prematura;) - "Nome = statichippo & BillingInfo = & BillingInfo.BillingName = statichippo" – hackerhasid

+0

Ho avuto lo stesso problema con un tipo annidato non vincolato. Risulta che ho avuto anche problemi con il mio HTML. Avevo 2 pulsanti di opzione in cui il nome era lo stesso del nome della proprietà sul mio modello di vista. Anche i valori dei pulsanti di opzione vengono registrati, quindi il raccoglitore modello predefinito viene confuso. –

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; } 
} 

Ho avuto il problema simile. Ho trascorso molte ore e trovare il problema per caso che non dovrei usare 'modello' per il nome della proprietà

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

Ho avuto questo problema, e la risposta mi stava guardando in faccia per qualche ora. Lo sto includendo qui perché stavo cercando modelli annidati non vincolanti e sono giunto a questa risposta.

Assicurarsi che le proprietà del modello annidato, come qualsiasi modello per il quale si desidera che l'associazione funzioni, dispongano delle funzioni di accesso corrette.

// 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

Ho ricontrollato e anche i miei modelli visivi mancavano {get; impostato; } - C'è una sorta di cecità che ci impedisce di vedere questo! – niico

0

Ho avuto lo stesso problema, lo sviluppatore precedente del progetto ha avuto la proprietà registrato con un setter privata come lui non stava usando questo ViewModel in un postback.Qualcosa di simile a questo:

public MyViewModel NestedModel { get; private set; } 

cambiato a questo:

public MyViewModel NestedModel { get; set; } 
1

Questo è ciò che ha funzionato per me.

ho cambiato questo:

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

A:

[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

Ha funzionato anche per me. Grazie per questa soluzione. – Sam

Problemi correlati