html.textboxはモデルの代わりにrequest.paramsを使用しますか?
-
11-09-2019 - |
質問
簡単なテストアプリケーションがあります:
モデル:
public class Counter
{
public int Count { get; set; }
public Counter()
{
Count = 4;
}
}
コントローラ:
public class TestController : Controller
{
public ActionResult Increment(Counter counter)
{
counter.Count++;
return View(counter);
}
}
意見:
<form action="/test/increment" method="post">
<input type="text" name="Count" value="<%= Model.Count %>" />
<input type="submit" value="Submit" />
</form>
送信]をクリックすると、そのような値が得られます。
5, 6, 7, 8, ...
html.textboxで同じ動作を期待していました
<form action="/test/increment" method="post">
<%= Html.TextBox("Count") %>
<input type="submit" value="Submit" />
</form>
しかし、実際には手に入れました
5, 5, 5, 5.
html.textboxはモデルの代わりにrequest.paramsを使用しているようですか?
解決
html.textbox()は、内部viewdata.eval()メソッドを使用します。これは、最初に辞書viewdata.modelstateから値を取得しようと試みます。これは、無効なフォームの送信後に入力された値を復元できるようにするために行われます。
viewdata.modelstate dictionaryからカウント値を削除するのは次のとおりです。
public ActionResult Increment(Counter counter)
{
counter.Count++;
ViewData.ModelState.Remove("Count");
return View(counter);
}
別の解決策は、操作を取得してポストするための2つの異なるコントローラーメソッドを作成することです。
public ActionResult Increment(int? count)
{
Counter counter = new Counter();
if (count != null)
counter.Count = count.Value;
return View("Increment", counter);
}
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Increment(Counter counter)
{
counter.Count++;
return RedirectToAction("Increment", counter);
}
カウンターオブジェクトは、TempData辞書を介して渡すこともできます。
記事にも興味があるかもしれません viewdata.eval()を使用してフォームフィールドを再形成する スティーブン・ウォルサー。
他のヒント
それはここでの問題ではありません。指定
<%= Html.TextBox("Count") %>
指定と同等です
<%= Html.TextBox("Count", null) %>
ModelStatedictionaryから一致する値(「カウント」と呼ばれる)を引きます。
それでも、明示的に渡されます
<%= Html.TextBox("Count", Model.Count) %>
ALEX2K8で記述された同じ動作が結果になります。
html.textboxには1つ以上のパラメーターがあります。最初のパラメーターは入力要素の名前またはIDであり、2番目のパラメーターは値です...
したがって、このようにテキストボックスヘルパーを書く:
<%= Html.TextBox("Count",Model.Count) %>
乾杯