2010-03-17 70 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