【问题标题】:asp.net mvc and model binding objects with sub objectsasp.net mvc 和模型绑定对象与子对象
【发布时间】:2009-11-27 19:52:01
【问题描述】:

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

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

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

但是我对如何将 PageContent 项分配给表单有点模糊,以便保持它的模型绑定。

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

这是一个sn-p的形式:

<% 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 方面。

编辑: 这是我发布到的基本控制器方法:

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

我没有使用 Request.Form 样式

请帮忙:D

【问题讨论】:

  • 你的控制器中的 post 方法是什么样的?
  • Page.PageContents 的类型是什么?它是 IList 还是 PageContent[] ?我从来没有能够绑定到一个数组。
  • 我正在使用直接的 DBML 自动魔法类。所以它是一个 EntitySet:EntitySet Page.PageContents

标签: asp.net-mvc


【解决方案1】:

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

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

// 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 已经很久了。

【讨论】:

  • bam,它有效:D 欢呼你是明星。希望这个小技巧在 mvc 2.0 中得到修复
猜你喜欢
  • 2015-03-28
  • 1970-01-01
  • 2013-04-02
  • 2011-05-22
  • 1970-01-01
  • 1970-01-01
  • 2011-11-22
  • 1970-01-01
相关资源
最近更新 更多