Обновление объекта с помощью дочернего элемента с помощью EditorTemplate

У меня есть объект (QuoteSheet), содержащий дочерний объект (QuoteTask), который загружается с помощью 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()
}

И 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 для редактирования дочернего объекта?


person Gavin Coates    schedule 16.12.2011    source источник
comment
Вы используете EntityObject производные объекты?   -  person Ladislav Mrnka    schedule 20.12.2011


Ответы (1)


Проблема в том, что привязка моделей по умолчанию пытается создать экземпляр вашего класса EF и установить свойства навигации при привязке данных формы к вашим типам параметров.

Посмотрите несколько похожих вопросов, например этот.

У вас есть два варианта:

  1. Не используйте классы EF в качестве моделей представления, а создайте собственные классы моделей представления для передачи данных между контроллером и представлением.

  2. Не привязывайтесь напрямую к классу EF в действии контроллера редактирования, а используйте параметр FormCollection и привяжите себя с помощью UpdateModel, как показано в связанном вопросе.

person Jan    schedule 20.12.2011