关于asp.net mvc:TempData keep()vs peek()

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上放一些东西

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

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

使用Peek,您可以得到值,而无需通过一次调用将其标记为删除,请参见msdn:

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"];

使用Keep,您可以指定要保留的标记为删除的密钥。检索对象并稍后保存以将其删除,这是两个不同的调用。参见msdn

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"];

当您始终要保留另一个请求的值时,可以使用Peek。保留值时使用Keep取决于其他逻辑。

关于TempData在这里和这里的工作方式,您有两个很好的问题

希望能帮助到你!


刚完成对Peek和Keep的理解后,最初就感到困惑。由于TempData在不同条件下的行为不同而引起混淆。您可以观看该视频,并通过演示https://www.facebook.com/video.php?v=689393794478113来解释"保持并偷看"

Tempdata有助于保留单个请求的值,CAN还可根据4个条件保留下一个请求的值"。

如果我们理解了这4点,那么您会更加清楚。下面是包含所有4个条件的图表,请阅读有关偷看和保持的第三点和第四点。

enter image description here

条件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()没有重载方法。

  • object peek(string key):返回一个对象,该对象包含具有特定密钥的项目,而不需要删除密钥。
  • 下面给出了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?

    是的,他们这样做,但是当第一个为void时,第二个返回并为object

    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就可以用于下一个请求,如上面的示例。