Modelos complejos y vistas parciales: problema de vinculación del modelo en ASP.NET MVC 3

Tengo 2 modelos en mi aplicación MVC 3 de muestra, SimpleModel y ComplexModel , que se muestran a continuación:

 public class SimpleModel { public string Status { get; set; } } public class ComplexModel { public ComplexModel() { Simple = new SimpleModel(); } public SimpleModel Simple{ get; set; } } 

Tengo vistas definidas para estos modelos:

_SimplePartial.cshtml :

 @model SimpleModel @Html.LabelFor(model => model.Status) @Html.EditorFor(model => model.Status) 

y Complex.cshtml :

 @model ComplexModel @using (Html.BeginForm()) { @Html.Partial("_SimplePartial", Model.Simple)  } 

Después de enviar el formulario, con un valor aleatorio ingresado en el campo Status , el valor no está vinculado a mi modelo. El campo de Status es NULL cuando estoy comprobando el modelo en mi acción de controlador:

 [HttpPost] public ActionResult Complex(ComplexModel model) { // model.Simple.Status is NULL, why ? } 

¿Por qué no está encuadernado? No quiero heredar modelos ¿Debo escribir mis carpetas modelo personalizadas para un caso tan simple?

Saludos.

En lugar de:

 @Html.Partial("_SimplePartial", Model.Simple) 

Te recomendaría usar plantillas de Editor:

 @model ComplexModel @using (Html.BeginForm()) { @Html.EditorFor(x => x.Simple)  } 

y luego coloque el parcial simple dentro de ~/Views/Shared/EditorTemplates/SimpleModel.cshtml o dentro de ~/Views/Home/EditorTemplates/SimpleModel.cshtml donde Home es el nombre de su controlador:

 @model SimpleModel @Html.LabelFor(model => model.Status) @Html.EditorFor(model => model.Status) 

Por supuesto, si prefiere tener el parcial en algún lugar especial y no seguir las convenciones (¿por qué lo haría?), Podría especificar la ubicación:

 @Html.EditorFor(x => x.Simple, "~/Views/SomeUnexpectedLocation/_SimplePartial.cshtml") 

entonces todo entrará en su lugar como se espera.

Como Daniel Hall sugiere en su blog , pase un ViewDataDictionary con TemplateInfo donde HtmlFieldPrefix se establece con el nombre de la propiedad SimpleModel:

  @Html.Partial("_SimplePartial", Model.Simple, new ViewDataDictionary(ViewData) { TemplateInfo = new System.Web.Mvc.TemplateInfo { HtmlFieldPrefix = "Simple" } })