2014-11-20 44 views
2

TempData應該爲後續請求持續存在。但是,當我在後續控制器中檢查TempData時,我得到一個null。爲什麼要清除TempData []。這是我的兩個控制器。我正在接連打電話給他們。所以TempData []應該從一個請求持續到下一個請求。下面是從控制器代碼:儘管沒有請求發生,TempData []即被清除

[HttpGet] 
public ActionResult EditCampaign(int? Id) 
{ 

    ViewBag.Banner = bannerText.Replace(" ", " "); 
    // This is passed in case we need to add a new product or edit one. Then we'll 
    // need the campaign id for reference purposes. 
    TempData["campaign_id"] = Id; 
    TempData["campaignBanner"] = bannerText.Replace(" ", " "); 
    ViewBag.StartDate = debugger.startDate.ToShortDateString(); 
    ViewBag.EndDate = debugger.endDate.ToShortDateString(); 
    int Id1 = Convert.ToInt32(TempData["campaign_id"]); 
    int convertedId1 = Id1 

這裏是我嘗試在控制器2中得到的值:

[HttpPost] 
public ActionResult EditCampaign(CampaignDTO camps) 
{ 
    // Do this up top. i.e. get the campaign ID 
    camps.Id = Convert.ToInt32(TempData["campaign_id"]); 
    string success = ""; 

我懷疑,在控制器1可能的倒數第二行分配的TempData的值擦掉數據。如果那是新事物並且沒有記錄的情況。請幫忙。

回答

4

讀取數據足以將其刪除。下面是相關的源:

public object this[string key] 
{ 
    get 
    { 
     object value; 
     if (TryGetValue(key, out value)) 
     { 
      _initialKeys.Remove(key); 
      return value; 
     } 
     return null; 
    } 
    set 
    { 
     _data[key] = value; 
     _initialKeys.Add(key); 
    } 
} 

所以在控制器1,當你說:

int Id1 = Convert.ToInt32(TempData["campaign_id"]); 

你實際上刪除您剛插入的數據。

有很多方法可以解決這個問題,但是如果您必須從TempData中讀取它,請改用Peek()

+1

很好的答案。謝謝 – 2014-11-20 21:25:24

+0

完美的答案。從未在任何地方看到過。 – 2014-11-20 21:32:46

1

TempData的時要重定向(HTTP 302或303,在MVC即RedirectToAction)沿着一些上下文傳遞是有用的。它不會在單獨的HTTP請求中持續存在。根據您的代碼示例,它建議您的客戶端代碼首先向控制器1發出GET請求,然後向控制器2發出第二個請求。

你最好的選擇是可能返回必要的數據作爲你在控制器中的響應的一部分,然後將控制器的輸入請求的一部分。您也可以使用會話變量https://code.msdn.microsoft.com/How-to-create-and-access-447ada98

+0

我也認爲在我的情況下會話變量是一個更好的選擇,然後TempData []。謝謝 – 2014-11-20 21:26:29

相關問題