Asp.net mvc 3 使用EditorTemplate更新具有子级的实体

Asp.net mvc 3 使用EditorTemplate更新具有子级的实体,asp.net-mvc-3,entity-framework,mvc-editor-templates,Asp.net Mvc 3,Entity Framework,Mvc Editor Templates,我有一个包含子实体(QuoteTask)的实体(QuoteSheet),该子实体是使用EntityFramework加载的。但是,我在提交此表单时收到一个错误 我已经为QuoteSheet实体创建了一个编辑页面,然后使用EditorTemplate编辑QuoteTask子实体 控制器代码如下所示: public ActionResult TestEdit(int Id) { var quote = DataContext.QuoteSheets.Where(x => x.ID ==

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

我已经为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()
}
该视图的精简版本如下所示:

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()
}
@使用(Html.BeginForm())
{ 
@Html.ValidationSummary(true)
@Html.HiddenFor(x=>x.JobID);
工作表详细信息
Sheet Desc.@Html.TextBoxFor(x=>x.Description,新的{size=“50”})
量Required@Html.EditorFor(x=>x.数量)
任务
劳工团体
任务描述
总小时数
比率
成本
@Html.EditorFor(x=>x.QuoteTasks)
@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>
@model Ornavi.Models.QuoteTask
@EditorFor(x=>Model.LabourGroup)
@EditorFor(x=>Model.Description)
@EditorFor(x=>Model.TotalHours)
@EditorFor(x=>Model.Rate)
@HiddenFor(x=>Model.ID)
当我提交表单时,我收到以下错误:

EntityCollection已初始化。在反序列化对象图期间,仅应调用InitializeRelatedCollection方法来初始化新的EntityCollection

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

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


关于如何成功使用EditorTemplate编辑子实体,您有什么想法吗?

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

请看一些类似的问题,如

您有两个选择:

  • 不要将EF类用作viewmodels,而是创建自己的viewmodel类,以便在控制器和视图之间传递数据

  • 在编辑控制器操作中,不要直接绑定到EF类,而是使用
    FormCollection
    参数并使用
    UpdateModel
    进行绑定,如链接问题所示


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

    请看一些类似的问题,如

    您有两个选择:

  • 不要将EF类用作viewmodels,而是创建自己的viewmodel类,以便在控制器和视图之间传递数据

  • 在编辑控制器操作中,不要直接绑定到EF类,而是使用
    FormCollection
    参数并使用
    UpdateModel
    进行绑定,如链接问题所示


  • 您使用的是
    EntityObject
    派生实体吗?您使用的是
    EntityObject
    派生实体吗?