2010-10-13 22 views
7

Parece que otros han tenido este problema, pero parece que no puedo encontrar una solución.DefaultModelBinder no vinculante modelo anidado

tengo 2 modelos: Persona & BillingInfo:

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

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

y estoy tratando de obligar a esta recta en mi acción mediante el DefaultModelBinder.

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

Sin embargo, mientras que la propiedad Person.Name se establece, el BillingInfo siempre es nula.

Mi mensaje es el siguiente:

"Name = statichippo & BillingInfo.BillingName = statichippo"

¿Por qué es siempre nula BillingInfo?

Respuesta

5

Estado no repro. Su problema está en otra parte y no puede determinar de dónde proviene lo que ha dado como información. La carpeta de modelo predeterminada funciona perfectamente bien con clases anidadas. Lo he usado una infinidad de veces y siempre ha funcionado.

Modelo:

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

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

controlador:

[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" /> 
<% } %> 

valores Publicado: Name=statichippo&BillingInfo.BillingName=statichippo está perfectamente consolidados en la acción POST. Lo mismo funciona con GET también.


Uno de los casos es posible cuando esto podría no trabajar es la siguiente:

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

Aviso cómo el parámetro de acción se llama billingInfo, mismo nombre que la propiedad BillingInfo. Asegúrate de que este no sea tu caso.

+0

que tienes razón. Resulta que mi HTML tenía un problema y estaba saliendo: – hackerhasid

+0

premature enter;) - "Name = statichippo & BillingInfo = & BillingInfo.BillingName = statichippo" – hackerhasid

+0

Tuve el mismo problema con un tipo anidado que no estaba enlazado. Resulta que también tuve problemas con mi HTML. Tenía 2 botones de opción donde el nombre era el mismo que el nombre de la propiedad en mi modelo de vista. Los valores del botón de opción también se publican, por lo que la carpeta de modelo predeterminada se confunde. –

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

He tenido el problema similar. He pasado muchas horas y encontrar el problema por accidente que no debería utilizar 'modelo' para el nombre de la propiedad

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

he tenido este problema, y ​​la respuesta me estaba mirando a la cara durante unas horas. Lo incluyo aquí porque estaba buscando modelos anidados no vinculantes y llegué a esta respuesta.

Asegúrese de que las propiedades de su modelo anidado, como cualquiera de los modelos para los que desea que trabaje el enlace, tengan los accesadores correctos.

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

Comprobé nuevamente y mis modelos de vista también faltaban {obtener; conjunto; } - ¡hay algún tipo de ceguera que nos impide ver esto! – niico

0

que tenían el mismo problema, el desarrollador anterior sobre el proyecto tenía la propiedad registrada con un colocador privada ya que no estaba usando este modelo de vista en una devolución de datos.Algo como esto:

public MyViewModel NestedModel { get; private set; } 

cambiado a esto:

public MyViewModel NestedModel { get; set; } 
1

Esto es lo que funcionó para mí.

me cambió esto:

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

Para:

[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

Funcionó para mí también. Gracias por esa solución. – Sam

Cuestiones relacionadas