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

ale*_*2k8 5 asp.net-mvc html-helper

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

模型:

public class Counter
{
    public int Count { get; set; }

    public Counter()
    {
        Count = 4;
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

public class TestController : Controller
{
    public ActionResult Increment(Counter counter)
    {
        counter.Count++;
        return View(counter);
    }
}
Run Code Online (Sandbox Code Playgroud)

视图:

<form action="/test/increment" method="post">
    <input type="text" name="Count" value="<%= Model.Count %>" />
    <input type="submit" value="Submit" /> 
</form>
Run Code Online (Sandbox Code Playgroud)

单击提交我得到这样的值:

5,6,7,8 ......

使用Html.TextBox我期望相同的行为

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

但实际上得到了

5,5,5,5.

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

Ale*_*yev 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);
}
Run Code Online (Sandbox Code Playgroud)

另一种解决方案是为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);
}
Run Code Online (Sandbox Code Playgroud)

Counter对象也可以通过TempData字典传递.

您可能还对Stephen Walther 撰写的文章Repopulate Form Fields with ViewData.Eval()感兴趣.