Когда объект в 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
вы указываете ключ, который был помечен для удаления, который вы хотите сохранить. Получение объекта и последующее его сохранение от удаления — это два разных вызова. См. 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 здесь и здесь
Надеюсь, поможет!
person
Daniel J.G.
schedule
21.01.2014
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
- person Menol   schedule 22.11.2019