2014-11-20 55 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

相关问题