0

MVC プロジェクトがあり、親エンティティと複数の子エンティティを同時に更新する必要がある場合があります。投稿アクションで、「x と x の間の関係を削除しようとしましたが、関係の外部キーの 1 つを削除しようとしました」というメッセージが表示されますが、これは奇妙です。Linq to SQL と MVC3 を使用しています。擬似コードは次のようになります。

@model Project.Models.ParentModel

...

@using (Html.BeginForm()) {
@Html.Label("Parent property")
@Html.EditorFor(model => model.ParentProperty)

@foreach (var child in Model.Childs)
{
Html.RenderPartial("_EditChild", child)
// Which is nothing more than a label and an editor for a property like:
// @model Project.Models.ChildModel
// @Html.Label("Child property")
// @Hteml.EditorFor(model => model.ChildProperty)
}

...

}

アクションは次のようになります。

public ActionResult Edit(int id, FormCollection collection)
{

var parent = new Parent();
TryUpdateModel(Parent()); // which updates the parent and the child properties correctly
dataContext.SubmitChanges();

}

誰でもこの動作を説明できますか。繰り返しますが、私は子エンティティを削除したりドロップしたりしません!

4

1 に答える 1

0

リストのバインドはかなり厄介な場合があります。私自身、いくつかの問題がありました。リスト編集コードを変更して子で動作するようにテストしたところ、動作し、データは正しくバインドされ、post アクションで表示されます。

@model MvcApplication2.Models.Parent

@using (Html.BeginForm())
{
    <table>
        @{
                <tr>
                    <td>
                        @Html.TextBoxFor(m => m.Text)
                        @Html.HiddenFor(m => m.ID)
                    </td>
                </tr>
                for (int i = 0; i < Model.Children.Count; i++)
                {
                            <tr>
                                <td>
                                    @Html.TextBoxFor(x => x.Children[i].Title)
                                    @Html.HiddenFor(x => x.Children[i].ID)
                                </td>
                            </tr>
                }
        }
    </table>
    <div class="button">
        <input class="submit" type="submit" name="btnSave" id="btnSave" value="Save" />
    </div>
}

私のテストのコントローラーは次のようになります。

[HttpGet]
public ActionResult EditingChildren()
{
    Parent parent = new Parent() { Text = "" };
    parent.Children = new List<Child>();
    parent.Children.Add(new Child() { Title = "" });
    parent.Children.Add(new Child() { Title = "" });
    parent.Children.Add(new Child() { Title = "" });
    return View(parent);
}

[HttpPost]
public ActionResult EditingChildren(Parent parent)
{
    // save parent with children
}

linq to sql を使用してデータを保存することに関する私の投稿を編集します。

ビューに ID をバインドしていない場合、post メソッドのオブジェクトでは空のままになります。これにより、データの保存に問題が発生します。したがって、通常は ID を非表示フィールドにバインドして、空にならないようにします (上記のコードを編集し、TextBoxFor の下に HiddenFor を追加します)。

この Web サイトで linq to sql を使用してデータを更新する方法についてもご覧ください。

http://davedewinter.com/2009/04/07/linq-to-sql-updating-entities/ (エンティティのアタッチ、プロパティの変更、更新の下)

そしてこの投稿: ここにリンクの説明を入力してください

于 2012-08-30T09:22:54.123 に答える