TempData keep()vs peek()

时间:2014-01-21 08:33:44

标签: asp.net-mvc 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.

我无法确切地知道差异是什么,难道他们都没有为另一个请求保留价值吗?

5 个答案:

答案 0 :(得分:115)

当读取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如何工作herehere

,您有两个很好的问题

希望它有所帮助!

答案 1 :(得分:41)

刚刚完成对Peek和Keep的理解并且最初也有同样的困惑。由于TempData在不同条件下表现不同,因此产生了混淆。您可以观看此视频,其中演示了Keep and Peek with demonstration https://www.facebook.com/video.php?v=689393794478113

Tempdata有助于保留单个请求的值,还可以为下一个请求保留值,具体取决于 4条件“。

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

enter image description here

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

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

string str = TempData[“MyData”];

即使您正在显示它,也是正常读取,如下面的代码。

@TempData[“MyData”];

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

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

条件4(Peek and Read): - 如果您使用“Peek”方法读取“TempData”,它将保留下一个请求。

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

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

答案 2 :(得分:5)

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 (字符串键):借助名称在TempData中保留特定项目。

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

    1. object peek (字符串键):返回一个包含具有特定键的项目的对象,而不进行删除键。
    2. TempData.Keep()&的返回类型示例TempData.Peek()方法如下所示。

        

      public void 保留(字符串键){       _retainedKeys.Add(键); }

           

      公共对象 Peek (字符串键){       对象值=值;       回报值; }

答案 3 :(得分:1)

  

他们是否都为另一个请求保留了值?

是的,但是当第一个是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
}

答案 4 :(得分:-1)

Keep()方法将字典中的指定键标记为保留

当阻止/保持值取决于其他逻辑时,可以使用Keep()。

当您阅读TempData并想要保留另一个请求时,请使用keep方法,这样TempData就可以用于下一个请求,如上例所示。