2011-01-29 62 views
1

我以为我直到现在才了解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); 
} 
+0

检查源代码。它可能只是您的浏览器为您填写。 – Alxandr 2011-01-29 02:38:47

回答

3

浏览器会缓存GET是从请求相同的网址。如果添加一个随机查询字符串变量,那么GET请求每次都会有所不同,并且浏览器不会缓存结果。

0

这是可以预料的。

当您通过GET提交表单时,您将序列化其元素并通过QueryString将其传递给目标。因此,在下一个请求中,您的搜索值将成为MVC模型的一部分。当你使用Html.TextBox助手时,它会自动注入模型的值作为HTML输入的值。这就是为什么你看到价值覆盖。

一个解决方案,以避免是不使用的HTML助手来解析输入:

<form action="" method="get"> 
    <div> 
    <input type="text" name="search" /> 
    <input type="submit" value="Search" /> 
    </div> 
</form> 

然后,你应该得到你的每个表单提交后期待洗涮。

相关问题