2010-10-13 6 views
7

On dirait que d'autres ont eu ce problème mais je n'arrive pas à trouver une solution.DefaultModelBinder ne lie pas le modèle imbriqué

J'ai 2 modèles: Personne & BillingInfo:

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

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

Et je suis en train de lier ce droit dans mon action en utilisant la DefaultModelBinder. Cependant, bien que la propriété Person.Name soit définie, la fonction BillingInfo est toujours NULL.

Mon poste ressemble à ceci:

"Name = statichippo & BillingInfo.BillingName = statichippo"

Pourquoi est BillingInfo toujours nulle?

Répondre

5

Statut non repro. Votre problème est ailleurs et incapable de déterminer d'où vient ce que vous avez donné comme information. Le classeur de modèle par défaut fonctionne parfaitement avec les classes imbriquées. Je l'ai utilisé une infinité de fois et ça a toujours marché.

Modèle:

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

Vue:

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

valeurs Publié: Name=statichippo&BillingInfo.BillingName=statichippo est parfaitement lié dans l'action POST. Même fonctionne avec GET.


Un cas possible lorsque cela pourrait ne pas fonctionner est la suivante:

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

Remarquez comment le paramètre d'action est appelé billingInfo, même nom que la propriété BillingInfo. Assurez-vous que ce n'est pas votre cas.

+0

Vous avez raison. Il s'avère que mon HTML a eu un problème et a été sortie: – hackerhasid

+0

prématurée;) - "Nom = statichippo & BillingInfo = & BillingInfo.BillingName = statichippo" – hackerhasid

+0

J'ai eu le même problème avec un type imbriqué n'étant pas lié. Il s'avère que j'avais aussi des problèmes avec mon HTML. J'avais 2 boutons radio où le nom était le même que le nom de la propriété sur mon modèle de vue. Les valeurs des boutons radio sont également affichées, de sorte que le classeur par défaut est devenu confus. –

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

J'ai eu le problème similaire. J'ai passé beaucoup d'heures et de trouver le problème par hasard que je ne devrais pas utiliser « modèle » pour le nom de la propriété

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

J'ai eu ce problème, et la réponse me regarder en face pendant quelques heures. Je l'ai inclus ici parce que je cherchais des modèles imbriqués non contraignants et suis venu à cette réponse.

Assurez-vous que les propriétés de votre modèle imbriqué, comme celles de tous les modèles pour lesquels vous souhaitez que la liaison fonctionne, aient les bons accesseurs.

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

J'ai revérifié et mes viewmodels manquaient aussi {get; ensemble; } - il y a une sorte d'aveuglement qui nous empêche de voir ça! – niico

0

J'ai eu le même problème, le développeur précédent sur le projet avait bien enregistré auprès d'un setter privé comme il n'a pas utilisé cette viewmodel dans un postback.Quelque chose comme ceci:

public MyViewModel NestedModel { get; private set; } 

changé à ceci:

public MyViewModel NestedModel { get; set; } 
1

C'est ce qui a fonctionné pour moi.

Je changé ceci:

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

Pour:

[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

A travaillé pour moi aussi. Merci pour cette solution. – Sam

Questions connexes