5

私は簡単なテストアプリケーションを持っています:

モデル:

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 は Model の代わりに Request.Params を使用しているようです。

4

3 に答える 3

8

Html.TextBox() は内部で ViewData.Eval() メソッドを使用します。このメソッドは、最初に辞書 ViewData.ModelState から値を取得し、次に ViewData.Model のプロパティから値を取得しようとします。これは、無効なフォームの送信後に入力した値を復元できるようにするために行われます。

ViewData.ModelState ディクショナリからカウント値を削除すると、次のことが役立ちます。

public ActionResult Increment(Counter counter)
{
    counter.Count++;
    ViewData.ModelState.Remove("Count");
    return View(counter);
}

もう 1 つの解決策は、GET 操作と POST 操作用に 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);
}

Counter オブジェクトは、TempData ディクショナリを介して渡すこともできます。

Stephen Walther による記事Repopulate Form Fields with ViewData.Eval()にも興味があるかもしれません。

于 2009-06-05T06:36:00.823 に答える
1

それはここでは問題ではありません。指定する

<%= Html.TextBox("Count") %>

を指定するのと同じです

<%= Html.TextBox("Count", null) %>

ModelStateDictionary から一致する値 ("Count" という名前) を取得します。

それでも、明示的に渡す

<%= Html.TextBox("Count", Model.Count) %>

alex2k8 で説明されているのと同じ動作になります。

于 2009-06-04T23:44:36.663 に答える
0

Html.TextBox には複数のパラメーターがあります。最初のパラメーターは入力要素の名前または ID であり、2 番目のパラメーターは値です...

したがって、テキストボックスヘルパーを次のように記述します。

<%= Html.TextBox("Count",Model.Count) %>

乾杯

于 2009-06-04T23:27:41.550 に答える