1. ホーム
  2. asp.net-mvc

[解決済み] ASP.Net MVC Html.HiddenForに間違った値が設定された場合

2022-06-12 05:59:12

質問

私はプロジェクトでMVC 3を使用していますが、非常に奇妙な動作を目にします。

モデル上の特定の値のために隠しフィールドを作成しようとしています。問題は、何らかの理由でフィールドに設定された値がモデル内の値に対応しないことです。

テストとして、こんなコードもあります。

<%:Html.Hidden("Step2", Model.Step) %>
<%:Html.HiddenFor(m => m.Step) %>

私は、両方の隠しフィールドが同じ値を持っていると思います。 私が行うことは、最初にビューを表示するときに値を1に設定し、投稿後にモデルフィールドの値を1増加させることです。

つまり、最初にページをレンダリングしたときは両方のコントロールに値1がありますが、2回目にレンダリングされる値はこれです。

<input id="Step2" name="Step2" type="hidden" value="2" />
<input id="Step" name="Step" type="hidden" value="1" />

ご覧の通り、1つ目の値は正しいのですが、2つ目の値は最初にViewを表示したときと同じになっているようです。

私は何を見逃しているのでしょうか?For Html ヘルパーは何らかの方法で値をキャッシュしているのでしょうか。もしそうなら、どのようにこのキャッシュを無効にすることができますか?

ご助力ありがとうございます。

どのように解決するのですか?

それは正常であり、HTMLヘルパーがどのように動作するかです。まずPOSTリクエストの値を使用し、その後にモデルの値を使用します。つまり、コントローラアクションでモデルの値を変更しても、POSTリクエストに同じ変数があれば、変更は無視され、POSTされた値が使用されるのです。

一つの可能な回避策は、値を変更しようとするコントローラアクションのモデル状態からこの値を削除することです。

// remove the Step variable from the model state 
// if you want the changes in the model to be
// taken into account
ModelState.Remove("Step");
model.Step = 2;

もう一つの可能性は、常にモデルの値を使用し、POST値を無視するカスタムHTMLヘルパーを書くことです。

さらに別の可能性として

<input type="hidden" name="Step" value="<%: Model.Step %>" />