asp.net mvc和带有子对象的模型绑定对象

时间:2009-11-27 10:43:04

标签: asp.net-mvc

我正在尝试让模型绑定表单中的子类。

我有一个带有相关PageContent类的Page类。 Page对象中有许多PageContent对象。 即Page.PageContents

我将Page作为模型返回,我可以看到所有的PageContent项目。

但是我对如何将PageContent项目分配给表单有点模糊,因此它会保持模型绑定。

当我将Page模型发布回控制器时,PageContent列表为空。

以下是表单的摘录:

<% using (Html.BeginForm("SavePage", "Admin")) {%>

    <fieldset>
        <legend>Fields</legend>
        <%=Html.Hidden("PageId", Model.PageId) %>
        <p>
            <label for="Title">Title:</label>
            <%= Html.TextBox("Title", Model.Title) %>
            <%= Html.ValidationMessage("Title", "*") %>
        </p>
        <p>
            <label for="SysName">SysName:</label>
            <%= Html.TextBox("SysName", Model.SysName) %>
            <%= Html.ValidationMessage("SysName", "*") %>
        </p>

        <% 
            int i = 0;
       foreach (var pageContent in Model.PageContents)

           { %>
            <div>
                <%=Html.Hidden("PageContents[" + i + "].PageContentId", pageContent.PageContentId) %>
                <%=Html.TextArea("PageContents[" + i + "].Content", pageContent.Content)%>                
            </div>
        <%
            i++;
       } %>

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

<% } %>

我想我没有正确地制作表格的PageContents方面。

编辑: 这是我POST的基本控制器方法:

public ActionResult SavePage(Page page)
    {
        // do stuff with page.PageContents
        return View("PageEdit", page);
    }

我没有使用Request.Form样式

请帮助:D

1 个答案:

答案 0 :(得分:1)

您说Page.PageContentsEntitySet<PageContent>并且您正在使用自动生成的类。所以,我想,你正在使用LINQ to SQL?如果是这样,那么您可以使用partial类来向生成的类添加属性

我记得我有一个类似的问题,我无法绑定到EntitySet<T>属性。我想我通过使用代理/占位符属性来修复它,这是一个有效设置实际属性的IList<T>。所以,在你的情况下,这看起来像这样:

// Your partial class, adding a property to the generated class
public partial class Page
{
    // Bind to this property
    public IList<PageContent> MyPageContents
    {
        set 
        { 
            var set = new EntitySet<PageContent>();
            set.AddRange(value);
            PageContents = set; 
        }
        get  { return PageContents; }
    }
}

// This and probably a lot more is created by LINQ to SQL
public partial class Page {
    // ...

    public EntitySet<PageContent> PageContents
    {
        get;
        set;
    }

    // ...
}

我认为partial类必须与自动生成的类位于同一名称空间中。更多信息:Adding new methods to LINQ to SQL generated classes

然后,在您的表单中,绑定到MyPageContents(当然可以使用更好的名称)而不是PageContents。

希望它适合你,自从我上次使用LINQ to SQL以来已经很久了。