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.
我真的不能知道有什么区别,难道它们都为另一个请求保留了价值吗?
读取
这意味着如果您在TempData上放一些东西
1 | TempData["value"] ="someValueForNextRequest"; |
并且在您访问它的另一个请求中,该值将存在,但是一旦您将其读取,该值将被标记为删除:
1 2 3 4 5 | //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 |
使用
1 2 3 4 5 | //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"]; |
使用
1 2 3 4 5 6 7 | //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"]; |
当您始终要保留另一个请求的值时,可以使用
关于TempData在这里和这里的工作方式,您有两个很好的问题
希望能帮助到你!
刚完成对Peek和Keep的理解后,最初就感到困惑。由于TempData在不同条件下的行为不同而引起混淆。您可以观看该视频,并通过演示https://www.facebook.com/video.php?v=689393794478113来解释"保持并偷看"
Tempdata有助于保留单个请求的值,CAN还可根据4个条件保留下一个请求的值"。
如果我们理解了这4点,那么您会更加清楚。下面是包含所有4个条件的图表,请阅读有关偷看和保持的第三点和第四点。
条件1(未读):-如果在操作中设置了" TempData",并且未在视图中读取,则" TempData"将保留用于下一个请求。
条件2(正常读取):-如果您像下面的代码一样正常读取" TempData",它将不会继续存在下一个请求。
1 | string str = TempData["MyData"]; |
即使您正在显示它,也像下面的代码一样正常阅读。
1 | @TempData["MyData"]; |
条件3(读取并保留):-如果您读取" TempData"并调用" Keep"方法,它将被保留。
1 2 | @TempData["MyData"]; TempData.Keep("MyData"); |
条件4(窥视和读取):-如果您使用"窥视"方法读取" TempData",则该数据将持续到下一个请求。
1 | 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个重载方法。
void keep():威胁所有在当前请求完成时未删除的数据。
void keep(string key):在名称的帮助下将特定项保留在TempData中。
TempData.Peek()没有重载方法。
下面给出了TempData.Keep()和TempData.Peek()方法的返回类型的示例。
public void Keep(string key) {
_retainedKeys.Add(key); }public object Peek(string key) {
object value = values;
return value; }
don't they both keep a value for another request?
是的,他们这样做,但是当第一个为
1 2 3 4 5 6 7 8 9 10 11 | 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 } |
Keep()方法将字典中的指定键标记为保留
当阻止/保持该值取决于其他逻辑时,可以使用Keep()。
当您读一个TempData并想要保留另一个请求时,请使用keep方法,这样TempData就可以用于下一个请求,如上面的示例。