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?
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()感兴趣.
| 归档时间: |
|
| 查看次数: |
1471 次 |
| 最近记录: |