keep()和peek()有什么区别?
MSDN说:
marks the specified key in the dictionary for retention.
returns an object that contains the element that is
associated with the specified key, without marking the key for
deletion.
我无法确切地知道差异是什么,难道他们都没有为另一个请求保留价值吗?
答案 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
Peek
和Keep
方法允许您读取值而不将其标记为删除。假设我们回到第一个将值保存到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
取决于其他逻辑。
希望它有所帮助!
答案 1 :(得分:41)
刚刚完成对Peek和Keep的理解并且最初也有同样的困惑。由于TempData在不同条件下表现不同,因此产生了混淆。您可以观看此视频,其中演示了Keep and Peek with demonstration https://www.facebook.com/video.php?v=689393794478113
Tempdata有助于保留单个请求的值,还可以为下一个请求保留值,具体取决于 4条件“。
如果我们理解这四点你会看到更清晰。下面是一个包含所有4个条件的图表,阅读第三和第四点,讨论Peek和Keep。
条件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个重载方法。
void keep ():这会威胁到当前请求完成时未删除的所有数据。
void keep (字符串键):借助名称在TempData中保留特定项目。
TempData.Peek()没有重载方法。
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就可以用于下一个请求,如上例所示。