为什么MVC坚持使用HttpGet?

时间:2011-01-29 02:32:29

标签: asp.net-mvc

我以为我直到现在才明白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);
}

2 个答案:

答案 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>

然后,您应该在每次提交表单后获得您期望的清单。