为什么在TempData中添加许多项时TempData总是为null?

我在控制器中的代码:

TempData[Partial1.TempDataKey] = "bla bla";
TempData[Partial2.TempDataKey] = "bla bla 2";


我的代码在布局中:

@{Html.RenderPartial(MVC.Administrator.Shared.Views._Partial1);}
@{Html.RenderPartial(MVC.Administrator.Shared.Views._Partial2);}


我在_Partial1中的代码:

<span>@(TempData.ContainsKey(Partial1.TempDataKey))</span>


我在_Partial2中的代码:

<span>@(TempData.ContainsKey(Partial2.TempDataKey))</span>


结果始终是:

<span>False</span>
<span>False</span>


当我在控制器中删除它们时:

TempData[Partial1.TempDataKey] = "bla bla";
//TempData[Partial2.TempDataKey] = "bla bla 2";


那么结果是:

  <span>True</span>

最佳答案

访问它们后,TempData中的变量会自动标记为删除。您可以通过显式调用Keep方法来保留它们


  您可以使用TempDataDictionary对象以相同的方式传递数据
  您使用ViewDataDictionary对象。但是,
  TempDataDictionary对象仅在一个请求到另一个请求之间持续存在,
  除非您使用“保留”将一个或多个键标记为保留键
  方法。如果将密钥标记为保留,则该密钥将保留为
  下一个要求。
  
  TempDataDictionary对象的典型用法是传递
  动作方法重定向到另一个动作方法时的数据。
  例如,一种操作方法可能存储有关错误的信息
  在控制器的TempData属性中(返回一个
  TempDataDictionary对象),然后调用RedirectToAction
  方法。然后,下一个操作方法可以处理错误并呈现
  显示错误消息的视图。


资料来源:TempDataDictionary Class

因为我对它的生命周期感到好奇,所以我遍历了源代码,并在博客中撰写了有关进一步阅读的文章:Inner-workings of TempData in ASP.NET MVC 5

您还可以调用Peek方法来检索值并仍然保留它们。

07-25 21:00