HiddenFor 要注意
MVC View で、HiddenFor は View Model よりも ModelState の値を優先する。
これで困るのは、以下のようなシナリオ:
初回ページ(GET)で、HiddenFor(p=>p.Step) で値が "1" だとする。
ユーザーが何らかの入力を実施、POST する。
Controller にて Save その他処理し、Step を "2" に増やす。しかしながら必須入力漏れがあり、Redirect せずに、ModelState.IsValid == false のまま Render する。
このRenderの際、HiddenFor(p=>p.Step) は、値 "1" を採ってしまう。
http://stackoverflow.com/questions/4710447/asp-net-mvc-html-hiddenfor-with-wrong-value
もしくは 、ModelState の値を変えちゃうには、
ModelState.SetModelValue("Property", new ValueProviderResult("", "abc", CultureInfo.InvariantCulture));
これで困るのは、以下のようなシナリオ:
初回ページ(GET)で、HiddenFor(p=>p.Step) で値が "1" だとする。
ユーザーが何らかの入力を実施、POST する。
Controller にて Save その他処理し、Step を "2" に増やす。しかしながら必須入力漏れがあり、Redirect せずに、ModelState.IsValid == false のまま Render する。
このRenderの際、HiddenFor(p=>p.Step) は、値 "1" を採ってしまう。
http://stackoverflow.com/questions/4710447/asp-net-mvc-html-hiddenfor-with-wrong-value
仕様なのだそうだが、理由はわからん。
よって、stateが変わる Action の場合、HiddenFor は使わぬが良し。
<input type="hidden" id="Step" name="Step" value="@Model.Step" />
もしくは 、ModelState の値を変えちゃうには、
ModelState.SetModelValue("Property", new ValueProviderResult("", "abc", CultureInfo.InvariantCulture));
ちなみに、bool 値を流したい場合は、文字列に変え、
<input type="hidden" id="Step" name="BoolValue" value="@Model.BoolValue.ToString()" />
JS 側では、
var boolValue = $("#BoolValue").val() === "True";
コメント
コメントを投稿