我以爲我直到現在才瞭解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