Encuadernación de modelo con modelos secundarios nesteds y PartialViews en ASP.NET MVC

Tengo los siguientes tipos y clases:

namespace MVC.Models public class Page { public EditableContent Content {get; set; } } public class EditableContent { public TemplateSection SidebarLeft {get; set; } public TemplateSection SidebarRight {get; set; } } 

Deseo editar la instancia de Page en mi vista Edit.aspx . Debido a que EditableContent también está conectado a otros modelos, tengo un PartialView llamado ContentEditor.ascx que está fuertemente tipado y toma una instancia de EditableContent y lo renderiza.

La parte de renderizado funciona bien, pero cuando ContentEditor todo, todo dentro de mi ContentEditor no está ContentEditor , lo que significa que Page.Content es null .

En PartialView, uso Html Helpers fuertemente tipado para hacer esto:

  m.TemplateId) %> 

Pero debido a que los elementos de entrada en el formulario que renderiza ContentEditor.ascx no obtienen el prefijo de Content en su atributo de id , los valores no están vinculados a la Page .

Traté de usar ayudantes sin tipeo para superar esto:

  

Y cuando trato con una propiedad que es una List de algo se pone muy feo. Luego tengo que representar los índices de colección manualmente.

¿Debo poner tanto Page y EditableContent como parámetros para la acción del controlador ?:

 public ActionResult Edit(Page page, EditableContent content) { ... } 

¿Qué me estoy perdiendo?

Le sugiero que use el EditorFor para EditorFor

Modelo:

 public class EditableContent { public string SidebarLeft { get; set; } public string SidebarRight { get; set; } } public class Page { public EditableContent Content { get; set; } } 

Vistas / Inicio / Index.aspx:

 <%@ Page Language="C#" MasterPageFile="~/Views/Shared/Site.Master" Inherits="System.Web.Mvc.ViewPage" %>  Home Page   <% using (Html.BeginForm()) { %> <%-- This is the important part: It will look for Views/Shared/EditorTemplates/EditableContent.ascx and render it. You could also specify a prefix --%> <%= Html.EditorFor(page => page.Content, "Content") %>  <% } %>  

Vistas / Compartidas / EditorTemplates / EditableContent.ascx:

 <%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%= Html.TextBoxFor(m => m.SidebarLeft) %> 
<%= Html.TextBoxFor(m => m.SidebarRight) %>

Y finalmente Controlador / HomeController:

 public class HomeController : Controller { public ActionResult Edit() { var page = new Page { Content = new EditableContent { SidebarLeft = "left", SidebarRight = "right" } }; return View(page); } [HttpPost] public ActionResult Edit(Page page) { return View(page); } }