2010-03-17 55 views
9

结合我有以下类型和类:模型嵌套子模型和PartialViews在ASP.NET MVC

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也附加到其他型号,我有一个PartialView被称为ContentEditor.ascx强类型,并采取EditableContent的实例并呈现它。

渲染部分的所有工作正常,但是当我发布 - 我ContentEditor里面一切都没有绑定 - 这意味着Page.Contentnull

在PartialView,我使用强类型HTML辅助方法来做到这一点:

<%= Html.HiddenFor(m => m.TemplateId) %> 

但因为由ContentEditor.ascx呈现在表单上输入元素没有得到Content前缀其id属性 - 在值不绑定到Page

我尝试使用松散类型的辅助方法解决此问题:

<%= Html.Hidden("Content.TemplateId", Model.TemplateId) %> 

,当我对付这种东西就变得非常难看List<T>的属性。然后我必须手动渲染集合索引。

我应该把页面和EditableContent作为参数传递给控制器​​动作?:

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

我缺少什么?

回答

18

我会建议你使用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<ToDD.Models.Page>" %> 

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server"> 
    Home Page 
</asp:Content> 

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 
<% 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") %> 
    <input type="submit" value="create" /> 
<% } %> 
</asp:Content> 

查看/共享/ EditorTemplates/EditableContent.ascx :

<%@ Control Language="C#" Inherits="System.Web.Mvc.ViewUserControl<ToDD.Models.EditableContent>" %> 

<%= Html.TextBoxFor(m => m.SidebarLeft) %> 
<br/> 
<%= Html.TextBoxFor(m => m.SidebarRight) %> 

最后控制器/ 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); 
    } 
} 
+1

它的作品,老兄!谢谢。我假设EditorFor负责所有的脚手架,把所有的东西捆绑在一起。 – MartinHN 2010-03-20 22:10:22

+1

我已经在我的一个项目上做了这个,但是你能解释为什么'Html.RenderPartial(“_ blah”,Model.Blah)'不起作用Darin?这就是我们以前的样子。 – GONeale 2011-09-05 10:08:45

+7

@GONeale,它不起作用,因为你传递了Model.Blah,所以在部分内部你在Blah的上下文中,而不是在Model =>的上下文中,你在这个部分中使用的所有帮助器都会生成错误的输入名称。编辑器模板不同=>它们考虑父上下文并生成在其内部使用的助手会生成适当的输入名称。只要看看你的标记,你会立即看到差异。要使默认模型联编程序正常工作,您必须遵守惯例。 – 2011-09-05 10:12:10