2011-12-16 77 views
0

我有一个实体(QuoteSheet),其中包含一个使用EntityFramework加载的子实体(QuoteTask)。不过,我在提交此表单时收到错误消息。用儿童使用EditorTemplate更新实体

我为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编辑子实体的任何想法?

+0

您是否使用EntityObject派生实体? – 2011-12-20 10:38:34

回答

3

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

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

你有两个选择:

  1. 不要使用EF类作为的ViewModels但创建自己的视图模型类通过控制器和视图之间的数据。

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