2010-08-17 266 views
0

我有一個模型,我可以正確綁定顯示的目的,但我不能發佈更新的版本。ASP.Net MVC模型綁定

我可以在強類型視圖中以更新的形式顯示頁面及其內容列表。

但是,當我發佈更新後的模型,即如果我更改了pagecontents內容,則發佈的模型包含Pages細節,但失去了頁面和pagecontent之間的關係。

所以當我得到頁面的顯示目的擴展PageContents頁面包含正確的deatils。

但是,當我更新和Post PageContents不包含頁面條目。

(順便說一句可能是一個紅色的鯡魚,但我使用功能NHibernate)

不幸的是我無法找到我錯過了什麼。

因此,這裏是我的代碼的刪節版:

public class Page 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual string Title { get; set; } 

    public virtual IList<PageContent> PageContents { get; private set; } 

    public Page() 
    { 
     PageContents = new List<PageContent>(); 
    } 

    public virtual void AddPageContent(PageContent pageContent) 
    { 
     pageContent.Page = this; 
     PageContents.Add(pageContent); 
    } 
} 


public class PageContent 
{ 
    public virtual int Id { get; private set; } 
    public virtual string Name { get; set; } 
    public virtual string Description { get; set; } 
    public virtual string Content { get; set; } 
    public virtual Page Page { get; set; } 
} 
Page <%= Html.LabelFor(model => model.Title) %>: 
<%= Html.TextBoxFor(model => model.Title, new { @class = "wide-input" })%> 
<%= Html.ValidationMessageFor(model => model.Title) %> 

Page <%= Html.LabelFor(model => model.Name) %>: 
<%= Html.TextBoxFor(model => model.Name, new { @class = "wide-input" })%> 
<%= Html.ValidationMessageFor(model => model.Name) %> 

<% 
    foreach (var item in Model.PageContents) 
    { 
%> 
     <%= Html.TextAreaFor(m => item.Content) %> 

<% 
    } 
%> 

<p><input type="submit" value="Save" /></p> 

<% } %> 

回答

1

基本上你需要的唯一ID的每個列表元素。喜歡的東西

<input id="PageContents_0_Content" name="PageContents[0].Content" value="..." /> 

這可以這樣做:

<%= Html.TextBox(string.Format("PageContents[{0}].Content", i), Model.Products[i].Id) %> 

這我這篇文章:

http://weblogs.asp.net/nmarun/archive/2010/03/13/asp-net-mvc-2-model-binding-for-a-collection.aspx

此博文描述了一個更好的解決方案:

http://blog.stevensanderson.com/2010/01/28/editing-a-variable-length-list-aspnet-mvc-2-style/

它使用自己的擴展HTML Helper方法來初始化列表綁定。

編輯:我誤解了這一點,集中在與ASP.NET MVC類別:

,如果我改變了pagecontents內容則發佈模型包含網頁的細節,但失去的頁面之間的關係,頁面內容。

據我所知,MVC不能恢復這種關係。如果在PostBack之後Page已經包含PageContent,那麼一切都很「好」。意思是:您的收藏已正確發回。但是MVC對你的PageContent.Page參考不瞭解。所以你必須手動恢復。

EDIT2:

(順便說一句可能是一個紅色的鯡魚,但我使用功能NHibernate)

如果我解釋是正確的,你正在使用你的模型直接綁定您的意見 - 對?如果是這樣,我建議你創建ViewModels,從你的模型和背部複製一切。這將使模型與視圖分離。您的ViewModel可以提供更多您的視圖所需的信息。請參閱MVVM模式。

+0

感謝您的回覆 - 我將我的代碼更改爲以下代碼<%= Html.TextArea(string.Format(「PageContents [{0}]。Content」,i),Model.PageContents [i] .Content )%>但問題仍然相同。當控制器收到頁面時,頁面包含一系列PageContents,爲了所有意圖和目的都是新的,並且它們不包含返回Page的引用。 – 2010-08-17 10:42:59

+0

是的,我會沿着ViewModel路線走。我想我陷入了一些雙重思考! – 2010-08-17 13:38:16