TempData keep()vs peek()

keep()和peek()有什么区别?

MSDN说:

  • keep(): marks the specified key in the dictionary for retention.
  • peek(): returns an object that contains the element that is associated with the specified key, without marking the key for deletion.

我真的不明白有什么区别,难道他们都没有为另一个要求保留一个价值?

读取TempDataDictionary的对象时,将在该请求结束时将其标记为删除。

这意味着如果你把一些TempData的东西

 TempData["value"] = "someValueForNextRequest"; 

在另一个请求中,您可以访问它的值,但是只要您阅读它,该值将被标记为删除:

 //second request, read value and is marked for deletion object value = TempData["value"]; //third request, value is not there as it was deleted at the end of the second request TempData["value"] == null 

PeekKeep方法允许您读取值,而不标记为删除。 假设我们回到第一个请求的值被保存到TempData。

通过Peek您可以获得该值,而不用通过单个调用将其标记为删除,请参阅msdn :

 //second request, PEEK value so it is not deleted at the end of the request object value = TempData.Peek("value"); //third request, read value and mark it for deletion object value = TempData["value"]; 

随着Keep你指定一个键被标记为删除,你想保持。 检索对象,并稍后保存它删除是2个不同的调用。 看msdn

 //second request, get value marking it from deletion object value = TempData["value"]; //later on decide to keep it TempData.Keep("value"); //third request, read value and mark it for deletion object value = TempData["value"]; 

当你总是想保留另一个请求的值时,你可以使用Peek 。 保留值时使用Keep取决于其他逻辑。

您有两个关于TempData如何在这里和这里工作的好问题

希望它有帮助!

刚刚完成了对Peek和Keep的理解,最初也有同样的困惑。 由于TempData在不同的条件下行为不同,所以引起了混淆。 你可以观看这个video来解释Keep and Peek的演示https://www.facebook.com/video.php?v=689393794478113

Tempdata有助于保留单个请求的 ,并且还可以根据4个条件 保留下一个请求的 “。

如果我们理解了这四点,你会看到更多的清晰度。下面是一个包含所有4个条件的图表,请阅读关于Peek and Keep的第三点和第四点。

在这里输入图像描述

条件1(未读取): –如果您在操作中设置了“TempData”,并且您没有在视图中读取它,那么“TempData”将被保留用于下一个请求。

条件2(正常读取): –如果您通常读取“TempData”,如下面的代码,它不会持续下一个请求。

 string str = TempData[“MyData”]; 

即使你正在显示这是一个正常的阅读,如下面的代码。

 @TempData[“MyData”]; 

条件3(读取和保持): –如果您阅读“TempData”并调用“Keep”方法,它将被保留。

 @TempData[“MyData”]; TempData.Keep(“MyData”); 

条件4(Peek和Read): –如果您使用“Peek”方法读取“TempData”,它将会持续下一个请求。

 string str = TempData.Peek("Td").ToString(); 

参考: – http://www.codeproject.com/Articles/818493/MVC-Tempdata-Peek-and-Keep- confusion

TempData也是一个停留在HTTP请求时间的字典对象。 所以,TempData可以用来维护一个控制器动作到另一个控制器动作之间的数据。

每次使用TempData检查空值。 TempData包含两个方法keep()和peek(),用于维护从一个控制器动作到其他数据状态的数据状态。

TempDataDictionary对象被读取时,在请求的末尾标记为当前读取对象的删除。

keep()peek()方法用于在不删除当前读取对象的情况下读取数据。

你可以使用Peek()当你总是想要保持/阻止另一个请求的值。 当防止/保持值取决于附加逻辑时,可以使用Keep()

在TempData.Peek()和TempData.Keep()中重载,如下所示。

TempData.Keep()有2个重载的方法。

  1. void keep () :威胁当前请求完成时未删除的所有数据。

  2. void keep (string key) :在名称帮助下将特定项目保存在TempData中。

TempData.Peek()没有重载的方法。

  1. object peek (string key) :返回一个包含具有特定键的项目的对象,而不需要删除键。

下面给出了TempData.Keep()和TempData.Peek()方法返回types的示例。

public void Keep (string key){_retainedKeys.Add(key); }

公共对象Peek (string key){object value = values; 返回值; }

难道他们都没有为另一个要求保留一个价值?

是的,但是当第一个是void ,第二个返回并object

 public void Keep(string key) { _retainedKeys.Add(key); // just adds the key to the collection for retention } public object Peek(string key) { object value; _data.TryGetValue(key, out value); return value; // returns an object without marking it for deletion }