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的东西
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
取决于其他逻辑。
您有两个关于TempData如何在这里和这里工作的好问题
希望它有帮助!
刚刚完成了对Peek和Keep的理解,最初也有同样的困惑。 由于TempData在不同的条件下行为不同,所以引起了混淆。 你可以观看这个video来解释Keep and Peek的演示https://www.facebook.com/video.php?v=689393794478113
Tempdata有助于保留单个请求的值 ,并且还可以根据4个条件 保留下一个请求的值 “。
如果我们理解了这四点,你会看到更多的清晰度。下面是一个包含所有4个条件的图表,请阅读关于Peek and Keep的第三点和第四点。
条件1(未读取): –如果您在操作中设置了“TempData”,并且您没有在视图中读取它,那么“TempData”将被保留用于下一个请求。
条件2(正常读取): –如果您通常读取“TempData”,如下面的代码,它不会持续下一个请求。
string str = TempData[“MyData”];
即使你正在显示这是一个正常的阅读,如下面的代码。
@TempData[“MyData”];
条件3(读取和保持): –如果您阅读“TempData”并调用“Keep”方法,它将被保留。
@TempData[“MyData”]; TempData.Keep(“MyData”);
条件4(Peek和Read): –如果您使用“Peek”方法读取“TempData”,它将会持续下一个请求。
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()方法返回types的示例。
public void Keep (string key){_retainedKeys.Add(key); }
公共对象Peek (string key){object value = values; 返回值; }
难道他们都没有为另一个要求保留一个价值?
是的,但是当第一个是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 }
- MVC 3:使用HtmlHelpers有条件地添加已禁用的属性
- AllowAnonymous不能使用Custom AuthorizationAttribute
- 在ASP.NET MVC中使用IEnumerable模型的自定义编辑器模板的正确,惯用的方法
- 自动完成应用值不标签到文本框
- 如何构build企业MVC应用程序,以及Business Logic到哪里去?
- 尝试浏览* .cshtml文件时出现“这种types的页面没有送达”错误
- Javascript中的相对path在外部文件中
- System.Runtime.Serialization.Json命名空间在哪里?
- 反映参数名称:滥用C#lambdaexpression式或语法辉煌?