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 使用 Request.Params 而不是 Model?

4

3 回答 3

8

Html.TextBox() 在内部使用 ViewData.Eval() 方法,该方法首先尝试从字典 ViewData.ModelState 中检索值,然后从 ViewData.Model 的属性中检索值。这样做是为了允许在提交无效表单后恢复输入的值。

从 ViewData.ModelState 字典中删除 Count 值有助于:

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

另一种解决方案是为 GET 和 POST 操作创建两种不同的控制器方法:

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 字典传递。

您可能还对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,第二个参数是值...

所以像这样写你的文本框助手:

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

干杯

于 2009-06-04T23:27:41.550 回答