Modèles complexes et vues partielles – problème de liaison de modèle dans ASP.NET MVC 3

J’ai deux modèles dans mon exemple d’application MVC 3, SimpleModel et ComplexModel , présentés ci-dessous:

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

J’ai des vues définies pour ces modèles:

_SimplePartial.cshtml :

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

et Complex.cshtml :

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

Après avoir envoyé le formulaire, avec une valeur aléatoire entrée dans le champ Status , la valeur n’est pas liée à mon modèle. Le champ Status est NULL lorsque je vérifie le modèle dans mon action de contrôleur:

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

Pourquoi n’est-ce pas lié? Je ne veux pas hériter de modèles. Dois-je écrire mes modèles de classeurs personnalisés pour un cas aussi simple?

Cordialement.

Au lieu de:

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

Je vous recommande d’utiliser les modèles de l’éditeur:

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

puis placez le simple partiel dans ~/Views/Shared/EditorTemplates/SimpleModel.cshtml ou dans ~/Views/Home/EditorTemplates/SimpleModel.cshtmlHome est le nom de votre contrôleur:

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

Bien sûr, si vous préférez avoir le partiel dans un endroit spécial et ne pas suivre les conventions (pourquoi le feriez-vous?), Vous pouvez spécifier l’emplacement:

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

alors tout se mettra en place comme prévu.

Comme le suggère Daniel Hall sur son blog , transmettez un ViewDataDictionary avec un TemplateInfoHtmlFieldPrefix est défini sur le nom de la propriété SimpleModel:

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