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.
个人理解:
- keep(): 将已标记为删除状态的键 恢复为原状态
- peek(): 请求一次,键的状态不变
案例:
结果打断点调试,总结以下几点
- 定义
TempData["msg"] = "this is message for tempdata";
- 第一次请求
object msg = TempData["msg"];
请求成功,msg能够接受到“this is message for tempdata”
- 第二次请求
请求失败,返回null值
!注意:
如果在TempData的定义作用域中发起调用,无论有多少个调用都不会失败,例如
以上代码中,msg、msg2都能正常的获取值
原因:读取TempDataDictionary
中的对象时,该对象将在该请求结束时标记为删除。
看一下流程:
可以看见TempDataDictionary对象[图片来自Stack Overflow,TempData Set应该是有误的]有三种读取方式:Not Read、Peek Read以及Normal Read
Not Read和Peek Read之后会进入Persisted状态,等待下一次请求
而Normal Read之后有一个分路,如果选择keep,即可进入Persisted,我们不妨称其复活
而如果不采取任何手段,将被标记成Deleted,最终删除
至此,peek及keep的区别一目了然
其中TempDataDictionary为keep提供了两个重载方法:
一个是复活(保留)dictionary中的所有键,一个将指定键加入到HashSet保留集中
@TempData["msg"];
TempData.Keep("msg");
peek只提供了一个方法:
根据键返回对应的值,若没有该键将返回默认值。该方法不会使得改键被标记删除,而是直接进入Persisted
string str = TempData.Peek("msg").ToString();