使用EditorTemplate更新实体与子项

时间:2011-12-16 12:12:33

标签: asp.net-mvc-3 entity-framework mvc-editor-templates

我有一个Entity(QuoteSheet),它包含一个使用EntityFramework加载的子实体(QuoteTask)。但是,我在提交此表单时收到错误。

我为QuoteSheet实体创建了一个编辑页面,然后使用EditorTemplate编辑QuoteTask子实体。

控制器代码如下:

public ActionResult TestEdit(int Id)
{
    var quote = DataContext.QuoteSheets.Where(x => x.ID == Id).FirstOrDefault();
    return View(quote);
}

[HttpPost]
public ActionResult TestEdit(Models.QuoteSheet quote)
{
    return View(quote);
}

视图的精简版本如下:

@using (Html.BeginForm())
{ 
@Html.ValidationSummary(true)
@Html.HiddenFor(x => x.JobID);

<div class="sectionHeader">Sheet Details</div>
<div class="sectionContent">
    <table>
        <tr>
            <td width="150">Sheet Desc.</td><td>@Html.TextBoxFor(x => x.Description, new { size = "50" })</td>
        </tr>
        <tr>
            <td>Quantity Required</td><td>@Html.EditorFor(x => x.Quantity)</td>
        </tr>
    </table>
</div>

<div class="sectionHeader">Tasks</div>
<div class="sectionContent">
    <table id="Tasks">
        <tr>
            <th>Labour Group</th>
            <th>Task Description</th>
            <th>Total Hrs</th>
            <th>Rate</th>
            <th>Cost</th>
        </tr>
        @Html.EditorFor(x => x.QuoteTasks)
    </table>
    <input type="button" name="AddTasks" id="AddTasks" value="Add" />
</div>

<input type="submit" value="Submit" />

@Html.ValidationSummary()
}

EditorTemplate是:

@model Ornavi.Models.QuoteTask



<tr>
    <td>@Html.EditorFor(x => Model.LabourGroup)</td>
    <td>@Html.EditorFor(x => Model.Description)</td>
    <td>@Html.EditorFor(x => Model.TotalHours)</td>
    <td>@Html.EditorFor(x => Model.Rate)</td>
    <td>@Html.HiddenFor(x => Model.ID)</td>
</tr>

当我提交表单时,我收到以下错误:

EntityCollection已经初始化。只应在反序列化对象图时调用InitializeRelatedCollection方法初始化新的EntityCollection。

这只发生在我使用EditorTemplate时 - 如果我删除编辑器模板并只提交主实体,它就可以正常工作。

我在[httppost] TestEdit函数中放置了一个断点,但异常发生在它到达这一点之前。

关于如何成功使用EditorTemplate编辑子实体的任何想法?

1 个答案:

答案 0 :(得分:3)

问题是,默认的模型绑定器会尝试实例化您的EF类,并在将表单数据绑定到参数类型时设置导航属性。

查看类似的问题,例如this one

您有两种选择:

  1. 不要将您的EF类用作视图模型,而是创建自己的viewmodel类以在控制器和视图之间传递数据。

  2. 不要在编辑控制器操作中直接绑定到EF类,而是使用FormCollection参数并将自己绑定到UpdateModel,如链接问题所示。

    < / LI>