TempData 未按預期清除
我正在開發一個使用 ASP.NET 4.0 和 MVC 2.0 的應用程序。如果它以任何方式相關,我正在使用 VS2010。
我遇到了 TempData 的並發症。我沒有編寫原始程式碼,但它無法正常工作,我正在嘗試修復它。我沒有很多使用 TempData 和 ViewData 的經驗。
我有一個索引操作如下(虛擬碼):
public virtual ActionResult Index() { var vm = new IndexViewModel(); // some code here to set up the ViewModel if (TempData.ContainsKey("Success")) vm.Success = true; return View(MVC.Controller.Views.Index, vm); }我有一個如下的 POST 操作(虛擬碼):
[HttpPost] public virtual ActionResult Index(IndexViewModel vm, List<int> formData) { if (DoSomethingWithData(formData)) { TempData["Success"] = true; return RedirectToAction(MVC.Controller.ActionNames.Index); } TempData["Message"] = "Failed to use formData"; return View(MVC.Controller.Views.Index, vm); }如果 vm.Success 為真,視圖會發出一個表單並在其前面加上一條成功消息。它還將在 TempData 中發出消息
$$ “Message” $$如果它存在。 我第一次來到這個頁面時,我得到的只是表格。我輸入無效的表單數據並送出它……我得到了以錯誤消息開頭的表單,如預期的那樣。(我知道這裡的設計很糟糕,因為它沒有重定向……而且你在刷新等方面的使用者體驗很差,但我還不擔心)這一切都很好。
當我使用 VALID 表單數據時**,問題就出現了。**如果我送出有效的表單數據,我會按預期返回以成功消息開頭的頁面,但如果我刷新頁面,成功消息仍然存在。事實上,如果我去網站的一個完全不同的部分並導航回來,成功的資訊仍然存在。由於某種原因,在重定向和讀取之後,臨時數據仍然存在。既有重定向又有讀取……臨時數據現在不應該清楚嗎?
我有理由確定我導航到的其他地方沒有設置 TempData
$$ “Success” $$出於任何原因,但要確保我已經導航到Google之類的東西,然後直接返回到這個頁面的 URL,它看起來仍然像 TempData$$ “Success” $$被填充。 很明顯,要麼我不清楚 TempData 應該如何運作(不足為奇),要麼正在發生一些我根本沒有經驗的不尋常的事情。
歡迎任何建議!
謝謝,戴夫
$$ EDIT $$ 當有成功消息時,視圖實際上並沒有發出表單……它只發出成功消息。
視圖看起來或多或少是這樣的:
<% if (TempData.ContainsKey("Message")) { %> Emit message... <% } %> <% using (Html.BeginForm(MVC.Controller.ActionNames.Index, MVC.Controller.Name, FormMethod.Post, new { id = "form"})) { %> <% if (!Model.Success) { %> Emit form... <% } else { %> Emit confirmation message... <% } %> <% } %>弗朗西斯科向我指出了一些我沒有考慮過的東西……但事實證明,視圖模型的建構子將 Success 設置為 false……所以這並不奇怪。我確定 TempData
$$ “Success” $$仍然設置(而不是愚蠢地重複使用成功設置為 true 的視圖模型),因為我已經單步執行了程式碼,並且它不斷地進入設置 vm.success = true 的 if 語句,即使在刷新之後也是如此。
就像我在評論中所說的那樣添加這個。我建議做
if (TempData["Success"] != null) vm.Success = true;代替
if (TempData.ContainsKey("Success")) vm.Success = true;…所以它算作 TempData 讀取。很高興它奏效了。問候
Microsoft 對 TempData 的行為進行了更改,我們需要在 MVC 2 和 3 中註意這一點。TempData 現在不再在控制器操作週期結束時完全清除。TempData 現在可以(自動且無需您更改任何內容)持續到其他頁面。*TempData 鍵現在只有在被讀取後才會被清除。*此外,如果您使用 RedirectResult 或 RedirectToRouteResult,即使它們被讀取,它們也會持續存在。
以下是更多詳細資訊: warning-mvc-nets-tempdata-now-persists-across-screens