Asp.net mvc Html.TextBox是否使用Request.Params而不是Model?

Asp.net mvc Html.TextBox是否使用Request.Params而不是Model?,asp.net-mvc,html-helper,Asp.net Mvc,Html Helper,我有一个简单的测试应用程序: 型号: public class Counter { public int Count { get; set; } public Counter() { Count = 4; } } 控制器: public class TestController : Controller { public ActionResult Increment(Counter counter) { coun

我有一个简单的测试应用程序:

型号:

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);
    }
}
视图:


单击“提交”可获得以下值:

5、6、7、8

对于Html.TextBox,我期望有相同的行为

<form action="/test/increment" method="post">
    <%= Html.TextBox("Count") %>
    <input type="submit" value="Submit" /> 
</form>

但事实上

五,五,五,五


Html.TextBox似乎使用Request.Params而不是Model?

Html.TextBox有多个参数。第一个参数是输入元素的名称或id,第二个参数是值

因此,请按照以下方式编写文本框帮助器:

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


干杯这不是问题所在。指定

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

等同于指定

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

它将从ModelStateDictionary中提取匹配值(名为“Count”)

但即便如此,明确地传递

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

结果与alex2k8描述的行为相同。

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

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);
}
计数器对象也可以通过tempdatadictionary传递


您可能还对Stephen Walther的文章感兴趣。

那么为什么显式指定Model.Count不起作用?因为最初Html.TextBox()从ModelState字典中获取值。