TempData keep()与peek()


73

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.

我不能真正知道有什么区别,难道它们都为另一个请求保留了价值吗?


Peek()允许您读取项目而不将其标记为删除,同时Keep()允许您Revive使用TempData词典中的所有值(使用Keep())或Keep("Key")标记为删除的单个项目(使用)。我使用Keep()逻辑流程中存在特定标准的情况,该标准产生了需要保留TempData的需要,否则应(在正常情况下)将其清除。例如:var query = TempData["Query"]; /* then somewhere down the road */ if(keepQueryForSomeReason) TempData.Keep("Query"); // this revives Query from "marked for deleted" state
Menol

Answers:


141

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您指定要保留的标记为删除的密钥。检索对象并稍后保存以将其删除,这是两个不同的调用。参见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在这里这里的工作方式,您有两个很好的问题

希望能帮助到你!


删除实际上何时发生?因此,如果在读取后将其标记为删除,然后再执行其他一些操作并决定使用保留,那么是否可以保证只要启动了重定向,它就会存在?
eaglei22 2015年

1
执行完结果和所有过滤器后,它将在当前请求的末尾删除。只要您使用基本控制器类,请检查TempData.Save那里的用法
Daniel JG 2015年

46

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

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

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

在此处输入图片说明

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

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

string str = TempData["MyData"];

即使您正在显示它,也像下面的代码一样正常阅读。

@TempData["MyData"];

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

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

条件4(窥视和读取):-如果您使用“窥视”方法读取“ TempData”,则该数据将持续到下一个请求。

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

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


因此,下一个请求将保留“ Peek”方法,下一个请求或第三个请求将不保留“ Keep”方法,对吗?
Shaiju T 2015年

@stom Peek标记了保留密钥,因此数据将一直保留到下一个请求。
Anirudha Gupta

很好的解释。
SamuraiJack

6

TempData还是一个字典对象,在HTTP请求期间一直存在。因此,TempData可用于维护一个控制器动作与另一控制器动作之间的数据。

TempData每次用于检查空值。TempData包含两个方法keep()和peek(),用于维护从一个控制器动作到其他控制器动作的数据状态。

TempDataDictionary 对象被读取时,在请求的标记的结束作为删除到当前读取对象。

保持()PEEK()方法用于无缺失读取数据中的当前读取的对象。

当您始终想保留/阻止其他请求的值时,可以使用Peek()。当阻止/保持该值取决于其他逻辑时,可以使用Keep()

TempData.Peek()和TempData.Keep()中的重载如下所示。

TempData.Keep()有2个重载方法。

  1. void keep():威胁所有在当前请求完成时未删除的数据。

  2. void keep(字符串键):借助名称将特定项保留在TempData中。

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

  1. object peek(字符串键):返回一个对象,其中包含具有特定键的项目,而不需要删除键。

下面给出了TempData.Keep()和TempData.Peek()方法的返回类型的示例。

public void Keep(字符串键){_retainedKeys.Add(key); }

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


第一段的可能来源:十大ASP.NET MVC访谈问题,“ TempData还是在HTTP请求期间保留的字典对象。因此,Tempdata可用于维护重定向之间的数据,即从一个控制器到另一个另一个控制器。

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
}

-1

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

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

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


这个答案-已经有许多有用且正确的答案的旧问题-没有任何附加价值。请避免在现有内容上添加nothig的此类贡献,尤其是在已接受的较旧问题和有用答案上。
辛迪·梅斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.