0

EntityFramework を使用して読み込まれる子エンティティ (QuoteTask) を含むエンティティ (QuoteSheet) があります。しかし、このフォームを送信するとエラーが発生します。

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 を使用して子エンティティを編集する方法に関するアイデアはありますか?

4

1 に答える 1

3

問題は、デフォルトのmodelbinderが、フォームデータをパラメータータイプにバインドするときに、EFクラスをインスタンス化し、ナビゲーションプロパティを設定しようとすることです。

このようないくつかの同様の質問を参照してください。

2つのオプションがあります。

  1. EFクラスをビューモデルとして使用するのではなく、独自のビューモデルクラスを作成して、コントローラーとビューの間でデータを渡します。

  2. コントローラーの編集アクションでEFクラスに直接バインドするのではなく、リンクされた質問に示されているように、FormCollectionパラメーターを使用して自分自身をバインドします。UpdateModel

于 2011-12-20T10:42:06.997 に答える