Tempdata 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.

个人理解:

  • keep(): 将已标记为删除状态的键 恢复为原状态
  • peek(): 请求一次,键的状态不变

案例:

Tempdata keep与peek_第1张图片

结果打断点调试,总结以下几点

  • 定义
TempData["msg"] = "this is message for tempdata";
  •  第一次请求
object msg = TempData["msg"];

       请求成功,msg能够接受到“this is message for tempdata”

  • 第二次请求 

        请求失败,返回null值

!注意:

    如果在TempData的定义作用域中发起调用,无论有多少个调用都不会失败,例如

Tempdata keep与peek_第2张图片

以上代码中,msg、msg2都能正常的获取值

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

看一下流程:

Tempdata keep与peek_第3张图片

可以看见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提供了两个重载方法:

Tempdata keep与peek_第4张图片

一个是复活(保留)dictionary中的所有键,一个将指定键加入到HashSet保留集中

@TempData["msg"];
TempData.Keep("msg");

peek只提供了一个方法:

Tempdata keep与peek_第5张图片

根据键返回对应的值,若没有该键将返回默认值。该方法不会使得改键被标记删除,而是直接进入Persisted

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

你可能感兴趣的:(.NET)