代码之家  ›  专栏  ›  技术社区  ›  Nicholas Murray

ASP.NET MVC模型绑定

  •  0
  • Nicholas Murray  · 技术社区  · 14 年前

    我有一个模型,为了显示的目的,我可以正确绑定它,但是我不能发布更新的版本。

    我可以在表单中显示页面及其内容列表,以便在强类型视图中进行更新。

    但是,当我发布一个更新的模型时,即如果我更改了页面内容,那么发布的模型将包含页面的详细信息,但会丢失页面和页面内容之间的关系。

    因此,当我获取用于显示的页面时,扩展的页面内容页面包含正确的deatils。

    但是当我更新和发布页面时,内容不包含任何页面条目。

    (顺便说一句,可能是一条红鲱鱼,但我用的是流利的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 回复  |  直到 14 年前
        1
  •  1
  •   Arthur    14 年前

    基本上,每个列表元素都需要唯一的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

    这个blogpost描述了一个更好的解决方案:

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

    它使用自己的扩展HTML助手方法初始化列表绑定。

    编辑: 我误解了这一点,将重点放在使用ASP.NET MVC的集合上:

    如果我更改了页面内容,那么发布的模型将包含页面详细信息,但会丢失页面和页面内容之间的关系。

    据我所知,MVC无法恢复这种关系。如果页面在回发后已经包含页面内容,那么一切都是“好的”。意味着:你的收藏被正确地发回。但MVC不知道您的pageContent.page引用。所以如果手动的话,你必须恢复。

    编辑2:

    (顺便说一句,可能是一条红鲱鱼,但我用的是流利的NHibernate)

    如果我正确地解释了这一点,那么您将直接使用模型来绑定视图,对吗?如果是这样,我建议您创建视图模型,从您的模型复制所有内容,然后再复制。这将使模型与视图分离。您的视图模型可以提供视图所需的更多信息。参见MVVM模式。