2011-01-29 100 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> 

然後,你應該得到你的每個表單提交後期待洗涮。