136

プロジェクトで 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" />

ご覧のとおり、最初の値は正しいですが、2 番目の値はビューを初めて表示したときと同じようです。

私は何が欠けていますか?*For Html ヘルパーは何らかの方法で値をキャッシュしていますか? もしそうなら、どうすればこのキャッシュを無効にできますか?.

ご協力いただきありがとうございます。

4

4 に答える 4

197

これは正常であり、HTMLヘルパーの動作方法です。最初にPOSTリクエストの値を使用し、その後モデルの値を使用します。これは、コントローラーアクションでモデルの値を変更した場合でも、POSTリクエストに同じ変数がある場合、変更は無視され、POSTされた値が使用されることを意味します。

考えられる回避策の1つは、値を変更しようとしているコントローラーアクションのモデル状態からこの値を削除することです。

// 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;

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

そしてさらに別の可能性:

<input type="hidden" name="Step" value="<%: Model.Step %>" />
于 2011-01-17T07:29:35.333 に答える
22

すべてのステップで大きなモデルのさまざまな部分を表示するウィザードを作成しているときに、同じ問題に遭遇しました。
「ステップ 1」からのデータやエラーは「ステップ 2」などと混同され、最終的に ModelState が「原因」であることがわかりました。

これは私の簡単な解決策でした:

if (oldPageIndex != newPageIndex)
{
    ModelState.Clear(); // <-- solution
}

return View(model[newPageIndex]);
于 2013-08-16T14:53:47.420 に答える