我以为我直到现在才了解MVC。 给我一个GET应该是从一个干净的石板。但我今天发现MVC假定一个GET请求是一个POST请求,如果一个页面请求从它自己获取。 文本框应始终显示文本“红色”,而是保持其上一个视图的最后一个值。 像HTTPPost一样行事。您必须取消注释ModelState.Clear以像HttpGet一样行事。 这对我来说似乎是一个错误。为什么MVC坚持HttpGet?
<form action="" method="get">
<div>
<%=Html.TextBox("search") %>
<input type="submit" value="Search" />
</div>
</form>
[HttpGet]
public ActionResult Index(string search)
{
//ModelState.Clear();
ViewData["search"] = "Red";
var items = GetYourTestData;
if (!string.IsNullOrEmpty(search))
{
var items2 = items.Where(x => x.Color == search).ToList();
return View(items2);
}
return View(items);
}
搜索结果返回正确和不同的数据,因此它不是浏览器缓存。 出于搜索结果页面的目的,必须重定向到另一个页面以避免这种情况是没有意义的。这就是为什么我选择GET认为它应该每次都是干净的。
就像我在描述中所述。页面上的其他内容确实发生变化,因此它不是缓存。取消注释ModelState.Clear()和一切都很好,因此不是缓存。 您可以将动态日期时间标签始终显示来自服务器的最新时间,并且它会发生更改。这也证明它不是页面缓存。 这是一个非常简单的测试。是的,只要肯定,因为存在引力,如果HttpGet请求的页面与请求者相同,MVC2框架4.0会将其视为HTTPPost。如果您在编程期间没有意识到这一点,结果可能会是灾难性的。例如,如果像TurboTax这样的人使用MVC,我希望他们的开发人员知道这一点。 ... ViewData [“AdjustedTaxAmount”] = 3435.00; ...除非他们将此模型称为 ModelState.Clear(),否则不会起作用。
我不知道在的ModelState为什么应该得到这么 一个确保消防解决办法是 继承控制器基类
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
ModelState.Clear();
}
base.OnActionExecuted(filterContext);
}
检查源代码。它可能只是您的浏览器为您填写。 – Alxandr 2011-01-29 02:38:47