3

これはかなり単純な例です。

コントローラ

[httppost]
public ActionResult MyPage(MyModelClass myModel) {
    myModel.someProperty = "b";
    return view(myModel)
}

型指定されたビューには、someProperty の非表示フィールドが含まれています

@Html.HiddenFor(model => model.someProperty)

Get コントローラーは someProperty を "a" に設定します。

しかし、投稿後、ビュー内の someProperty の値はまだ「a」です

それは私には正しくないようです。洞察はありますか?どうも

4

2 に答える 2

4

ModelState投稿された値「a」を保持します。また、(モデル自体よりも) モデル値を設定する優先度が高いため、view は「a」をレンダリングします。ModelState から値を削除して、モデル値を使用することができます

[HttpPost]
public ActionResult MyPage(MyModelClass myModel) {
    myModel.someProperty = "b";

    ModelState.Remove("someProperty");    

    return view(myModel);
}
于 2012-04-20T15:29:35.987 に答える
3

これは実際に再現できますが(最初は驚きました)、頭をかいた後は理にかなっていると思います。

行にブレークポイントを設定するmyModel.SomeProperty = "b";と、プロパティが正しく設定されていることがわかります。そのため、MVCは、POSTの直接の結果としてビューをレンダリングしている(つまり、既存のモデル状態が存在する)という事実に基づいて仮定を行っていると思います。POSTの後にビューを再表示する場合、フォームにエラーが含まれているために再表示していると想定されるためだと思います。modelstateから値をフェッチすることにより、ユーザーが再試行できるようにフォームを正しく再入力できます。

編集:そしてもちろん、私が投稿するとすぐに、私ができるよりもそれをよりよく説明している記事を見つけます:http: //blogs.msdn.com/b/simonince/archive/2010/05/05/asp-net- mvc-s-html-helpers-render-the-wrong-value.aspx

于 2012-04-20T15:30:25.220 に答える