我有一个简单的测试应用程序:
型号:
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?
答案 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) %>
欢呼声