4

私のビューには次のような隠しフィールドがあります。

using (Html.BeginForm("Action", "Schedule"))
{
    @Html.Hidden("Id", Model.Schedule.Id)
    ...
}

そして、次のような情報を取り込むアクションメソッド:

public ActionResult AddEventToSchedule(Event NewEvent, Guid Id)
{
    // Do something
}

Model.Schedule.Idが空でない場合でも、空のGuidが渡され続けます。HTMLソースを確認しましたが、非表示フィールドも空のGUIDです(ブレークポイントを使用してModel.Schedule.Idが空でないことを確認しました)。

奇妙なことに、以下のようにモデルを介してId値にアクセスしようとすると、htmlの非表示フィールドにGUIDが正しく入力されましたが、actionメソッドに渡されたモデルは空でした。

public ActionResult AddEventToSchedule(Event NewEvent, ScheduleModel model)
{
    // model.Schedule is null!
}
4

1 に答える 1

14

この質問の助けを借りてこれを理解しました: MVC3モデルバインディング-隠しフィールドへのリスト

どうやらHTMLヘルパーは、Modelをチェックする前にModelStateの値をチェックしているようです。Idをパラメーターとしてアクションメソッドに追加したときにのみこの動作が見られた理由は、これがモデルバインダーを呼び出してModelStateにIdを設定したためです。そして、Idが常に空のGuidであった理由は、それがアクションメソッドが最初に呼び出されたときの値だからです。

この行をアクションメソッドに追加すると、すべてが正常に機能するようになりました。

ModelState.Remove("Id")
于 2013-02-21T00:24:57.680 に答える