TempData应该持续用于后续请求。但是,当我在后续控制器中检查TempData时,我得到一个null。为什么TempData []被抹去了。这是我的两个控制器。我连续打电话给他们。所以TempData []应该从一个请求持续到下一个请求。这是来自控制器1的代码:
[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
这是我尝试在Controller 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的值可能会擦除数据。如果那是一个新的,没有记录的情况。请帮忙。
答案 0 :(得分: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 :(得分:1)
你有一些有缺陷的信息。存储在TempData属性中的数据仅持续一个请求。
http://msdn.microsoft.com/en-us/library/system.web.mvc.viewpage.tempdata%28v=vs.118%29.aspx
答案 2 :(得分:1)
当您重定向(HTTP 302或303,即MVC中的RedirectToAction)以传递某些上下文时,TempData非常有用。它不会在单独的HTTP请求中持久存在。根据您的代码示例,它建议您的客户端代码首先向控制器1进行GET,然后向控制器2发出第二个请求。
您最好的选择可能是在控制器1中将必要的数据作为响应的一部分返回,然后将传入请求的那一部分发送给控制器。您也可以使用会话变量https://code.msdn.microsoft.com/How-to-create-and-access-447ada98。