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

时间:2009-06-04 21:52:28

标签: 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)
    {
        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?

3 个答案:

答案 0 :(得分: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()感兴趣。

答案 1 :(得分:1)

这不是问题所在。指定

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

相当于指定

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

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

但即便如此,明确传入

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

导致alex2k8描述的相同行为。

答案 2 :(得分:0)

Html.TextBox的参数多于one..first参数是input元素的名称或id,第二个参数是值...

所以写下你的文本框助手:

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

欢呼声