我以为我直到现在才明白MVC。 对我来说,GET应该是一个干净的名单。但我今天发现,如果页面请求自己获取,MVC会假定GET为POST。 文本框应始终显示文本“红色”,但它会保留上一个视图中的最后一个值。 像HTTPPost一样行事。您必须取消注释ModelState.Clear以充当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 一个肯定的火灾工作是 从基类继承Controller
protected override void OnActionExecuted(ActionExecutedContext filterContext)
{
if (string.Equals(filterContext.HttpContext.Request.HttpMethod, "GET", StringComparison.OrdinalIgnoreCase))
{
ModelState.Clear();
}
base.OnActionExecuted(filterContext);
}
答案 0 :(得分:3)
浏览器将缓存来自同一URL的GET请求。如果添加一个随机的查询字符串变量,那么每次GET请求都会有所不同,浏览器不会缓存结果。
答案 1 :(得分:0)
这是可以预期的。
当您通过GET提交表单时,您将序列化其元素并通过QueryString将它们传递给目标。因此,在下一个请求中,您的搜索值将成为MVC模型的一部分是有道理的。当您使用Html.TextBox帮助程序时,它会自动将模型的值作为HTML输入的值注入。这就是为什么你看到价值掩盖的原因。
避免这种情况的一个解决方案是不使用HTML Helper来呈现输入:
<form action="" method="get">
<div>
<input type="text" name="search" />
<input type="submit" value="Search" />
</div>
</form>
然后,您应该在每次提交表单后获得您期望的清单。