Asp.net-Mvc-2

TempData 未按預期清除

  • May 12, 2011

我正在開發一個使用 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

引用自:https://stackoverflow.com/questions/5953302