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.
Я не могу понять, в чем разница, разве они не сохраняют значение для другого запроса?
Ответы
Ответ 1
Когда объект в 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
, когда сохранение значения зависит от дополнительной логики.
У вас есть 2 хороших вопроса о том, как TempData работает здесь и здесь
Надеюсь, что это поможет!
Ответ 2
Только что закончил понимать Peek и Keep и имел ту же путаницу изначально. Путаница возникает из-за того, что TempData ведет себя по-разному в разных условиях. Вы можете посмотреть это видео, которое объясняет Keep and Peek с демонстрацией https://www.facebook.com/video.php?v=689393794478113
Tempdata помогает сохранять значения для одного запроса и МОЖЕТ БЫТЬ сохранить значения для следующего запроса в зависимости от 4 условий ".
Если мы поймем эти 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 и Read): - Если вы читаете "TempData" с помощью метода "Peek", он будет сохраняться для следующего запроса.
string str = TempData.Peek("Td").ToString();
Ссылка: - http://www.codeproject.com/Articles/818493/MVC-Tempdata-Peek-and-Keep-confusion
Ответ 3
TempDatastrong > также является объектом словаря, который остается на время
Запрос HTTP. Таким образом, TempData может использоваться для хранения данных между
действия контроллера на другое действие контроллера.
TempDatastrong > используется для проверки нулевых значений каждый раз. TempData содержит
два метода keep() и peek() для сохранения состояния данных из одного
действия контроллера другим.
Когда объект TempDataDictionary читается, в конце запросов метки
как удаление текущего объекта чтения.
Метод keep() и peek() используется для чтения данных без удаления
текущий объект чтения.
Вы можете использовать Peek(), когда вы всегда хотите удержать/предотвратить значение для
другой запрос. Вы можете использовать Сохранить(), если это значение
зависит от дополнительной логики.
Перегрузка в TempData.Peek() и TempData.Keep(), как указано ниже.
TempData.Keep() имеют 2 перегруженных метода.
-
void сохранить(): это означает, что все данные не удаляются при завершении текущего запроса.
-
void сохранить (строковый ключ): сохранить конкретный элемент в TempData с помощью имени.
TempData.Peek() нет перегруженных методов.
- object peek (строковый ключ): возвращает объект, содержащий элементы с определенным ключом, не делая ключ для удаления.
Пример для возвращаемого типа методов TempData.Keep() и TempData.Peek(), как показано ниже.
public void Сохранить (строковый ключ) { _retainedKeys.Add(ключ); }
общедоступный объект Peek (строковый ключ) { значение объекта = значения; возвращаемое значение; }
Ответ 4
Разве они не сохраняют значение для другого запроса?
Да, они делают, но когда первый из них 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
}
Ответ 5
Метод Keep() помечает указанный ключ в словаре для хранения
Вы можете использовать Keep(), когда значение параметра "предотвращать/удерживать" зависит от дополнительной логики.
когда вы читаете данные TempData и хотите сохранить для другого запроса, тогда используйте метод keep, чтобы TempData мог быть доступен для следующего запроса, как в примере выше.