5

ViewModel クラスに次のプロパティがあります。

public bool AreSimilarEntitiesChecked { get; set; }

私のコントローラーでは、その値を「true」に設定し、モデルでビューを返します。

model.AreSimilarEntitiesChecked = true;

return View(model).WithWarning("Check the similar mentors before saving!");

私のビューには、このプロパティの非表示のフィールドを配置したフォームがあります。

@Html.HiddenFor(m => m.AreSimilarEntitiesChecked)

AreSimilarEntitiesChecked を含むモデルで View が返された後、コントローラーで True 値を設定したにもかかわらず、その値は False のままです。

何が問題なのかわかりません。

生成された HTML:

<input name="AreSimilarEntitiesChecked" id="AreSimilarEntitiesChecked"
 type="hidden" value="False" data-val-required="The AreSimilarEntitiesChecked
 field is required." data-val="true">
4

1 に答える 1

6

これがあなたの質問からの問題であるとは確信できませんが、それが問題であることに多額のお金を賭けるでしょう...

ビューのモデル データの表現を保持するMVCModelStateは、バインドされたモデルから値を取得するのではなく、優先的に POST データから値を取得します。つまり、HTTP POST に (大文字と小文字を区別しない)AreSimilarEntitiesCheckedという値を持つフィールドが含まれFalseていた場合、ビューをレンダリングするときにビューモデルでそのプロパティを何に設定してもかまいません。ModelStateviewmodel 値よりも POSTed 値を優先します。

この奇妙な動作の理由は、ユーザーが整数を入力することになっているフィールドがあり、代わりに「バナナ」と書いているとしましょう。これは検証のためにサーバーに送信されますが、失敗します。「バナナ」がフィールドに残っていて、整数ではないというメッセージを表示して、ビューを再度レンダリングします。ただし、ビューがビューモデルのデータを優先的にレンダリングする場合、「バナナ」は整数ではなく、そのビューモデル フィールドに入れることができないため、それは不可能です。したがって、POST 値は保持されます。

これを修正するには、2 つのオプションがあります。このフィールドに対して具体的に修正できます。

ModelState.Remove("AreSimilarEntitiesChecked");

または核オプション:

ModelState.Clear();

この動作の詳細については、http ://weblog.west-wind.com/posts/2012/Apr/20/ASPNET-MVC-Postbacks-and-HtmlHelper-Controls-ignoring-Model-Changes をご覧ください。

于 2015-02-24T11:31:53.597 に答える