3

コントローラに次のようなアクションがあります。

[HttpPost]
public ActionResult Edit(EditMyObjectViewModel editMyObjectViewModel)
{
}

EditMyActionViewModelが含まれていますMyObject

これは編集ビューに渡されます(上記のコントローラーアクションのGETバージョン)

ポストインされたとき、IDが設定されていません
。コントローラーを次のように変更した場合:

[HttpPost]
public ActionResult Edit(Guid id, EditMyObjectViewModel editMyObjectViewModel)
{
    editMyObjectViewModel.ID = id;
}

それはうまくいきますが、少し間違っているようですか?

ビューの非表示フィールドをModel.IDにバインドすることもできると思いますか?

ここでの慣習は何ですか?

編集

モデル/ViewModelsは次のとおりです。

public class EditMyObjectViewModel
{
    public IEnumerable<SomeItem> SomeUnrelatedStuff { get; set; }
    public MyObject MyObject { get; set; }
}

public class MyObject
{
    public guid ID { get; set; }
    public string Name { get; set; }
}

ビューは次のとおりです。

@model MyApp.Models.EditMyObjectViewModel
@using (Html.BeginForm("Edit", "License", FormMethod.Post, new { @class = "form form-horizontal" }))
{
        @Html.TextboxFor(x=>x.MyObject.Name);
        <input type="submit" class="btn btn-success" value="Create Modification" />
}
4

1 に答える 1

8

そうです、IDを保持するための非表示フィールドを作成するか、アクションメソッドにパラメーターとしてIDを追加する必要があります。

問題は、IDがどこから来て、どのように入力されるかということです。デフォルトのモデルバインダーは、フォームフィールドからモデルにデータを入力します。クエリパラメータは使用しません。また、クエリパラメータはモデルには入りませんが、アクションメソッドの引数に入力されます。

もう1つできることは、カスタムモデルバインダーを作成して、クエリパラメーターをモデルに入力することです。しかし、それはこの状況ではやり過ぎのように感じます。さらに、ページ/モデルごとにこれを行う必要があります。

それは私でした。アクションメソッドにIDを追加します。

于 2012-11-15T16:54:07.590 に答える