尽管没有发出请求,TempData []也会被擦除

时间:2014-11-20 18:41:59

标签: c# asp.net asp.net-mvc asp.net-mvc-4 asp.net-web-api

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的值可能会擦除数据。如果那是一个新的,没有记录的情况。请帮忙。

3 个答案:

答案 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