与嵌套子模型和ASP.NET MVC中的PartialViews进行模型绑定
我有以下类型和类:
namespace MVC.Models public class Page { public EditableContent Content {get; set; } } public class EditableContent { public TemplateSection SidebarLeft {get; set; } public TemplateSection SidebarRight {get; set; } }
我想在Edit.aspx
视图中编辑Page
实例。 因为EditableContent
也附加到其他模型,所以我有一个名为ContentEditor.ascx
的PartialView
,它是强类型的,并且接受一个EditableContent
实例并呈现它。
渲染部分一切正常,但是当我发布时 – 我的ContentEditor
内的所有内容都没有绑定 – 这意味着Page.Content
为null
。
在PartialView上,我使用强类型的Html Helpers来执行此操作:
m.TemplateId) %>
但是因为ContentEditor.ascx
呈现的表单上的输入元素没有获得其id
属性的Content
前缀 – 这些值不会绑定到Page
。
我尝试使用松散类型的助手来克服这个问题:
当我处理一个属于List
的属性时,它变得非常难看。 然后我必须手动渲染集合索引。
我应该将Page和EditableContent作为参数添加到控制器操作中吗?:
public ActionResult Edit(Page page, EditableContent content) { ... }
我错过了什么?
我建议你使用EditorFor
帮助器
模型:
public class EditableContent { public string SidebarLeft { get; set; } public string SidebarRight { get; set; } } public class Page { public EditableContent Content { get; set; } }
查看/首页/的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") %> <% } %>
查看/共享/ EditorTemplates / EditableContent.ascx:
<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl" %> <%= Html.TextBoxFor(m => m.SidebarLeft) %>
<%= Html.TextBoxFor(m => m.SidebarRight) %>
最后是Controller / 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); } }