スポンサーリンク
POSTされたHIDDENの値が書き換わらない…
ASP.NET MVCでPOSTされたHiddenの値を、Contoller(コントローラー)の処理で書き換えても変更内容がHTML側に反映されない。
例えば、次のようにPOST時にHiddenValue
のプロパティを書き換えるプログラムを書いても、出力されるHTMLは書き換え前のHiddenの値となる。
cshtml
<form method="post">
<input asp-for="HiddenValue" type="hidden" />
<button type="submit">送信</button>
</form>
Contoller
public IActionResult Index()
{
var vm = new MyViewModel { HiddenValue = "最初のHIddenの値" };
return View(vm);
}
[HttpPost]
public IActionResult Index(MyViewModel vm)
{
vm.HiddenValue = "変更後のHiddenの値";
return View(vm);
}
▪️ 出力されるHTML
<form method="post">
<input value="最初のHIddenの値" type="hidden" />
<button type="submit">送信</button>
</form>
スポンサーリンク
ModelStateをクリアすると値が反映される
この動きはバグではなく、ModelState
ディクショナリの仕様に関連した動きです。
ASP.NET MVCでは、POSTされた値はModelState
ディクショナリに格納されます。そしてasp-for="xxx"
などで使用するタグヘルパーは、まずModelState
ディクショナリに該当のキーの値があるか調べて、あればそれを表示し、無かった時に初めてモデル(今回の例ではMyViewModel
)の値を表示します。
このように、HiddenなどのPOSTされる値については、ModelState
ディクショナリの値が優先して表示されますため、今回の用件であるContollerで設定した内容でHiddenの内容を書き換えたい場合は、ModelState
ディクショナリの内容をクリアしてあげれば反映されます。
ModelStateのクリア
ModelState
ディクショナリをクリアする方法には、次の2つの方法があります。
1つ目はModelState
全体をクリアする方法です。この方法の場合、値を書き換えたいHidden以外のすべてのPOSTデータが、ModelState
からクリアされます。
[HttpPost]
public IActionResult Index(MyViewModel vm)
{
ModelState.Clear();
vm.HiddenValue = "変更後のHiddenの値";
return View(vm);
}
2つ目は指定したキーのみ、ModelState
から削除する方法である。指定したキーのデータのみ削除され、その他のPOSTデータはModelState
に残る。
[HttpPost]
public IActionResult Index(MyViewModel vm)
{
ModelState.Remove("HiddenValue")
vm.HiddenValue = "変更後のHiddenの値";
return View(vm);
}
0 件のコメント:
コメントを投稿