2010-08-17 198 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