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.

Я не могу понять, в чем разница, разве они оба не сохраняют значение для другого запроса?

4 ответов


когда объект в 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 при сохранении значения зависит от дополнительной логики.

у вас есть 2 хороших вопроса о том, как работает TempData здесь и здесь

надеюсь, что это помогает!


только что закончил понимание Peek и Keep и имел такую же путаницу изначально. Путаница возникает из-за того, что TempData ведет себя по-разному при разных условиях. Вы можете посмотреть это видео, которое объясняет Keep и 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 (заглянуть и прочитать): - если Вы читаете "TempData" с помощью метода" Peek", он будет сохраняться для следующего запрос.

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

ссылка : - http://www.codeproject.com/Articles/818493/MVC-Tempdata-Peek-and-Keep-confusion


данных tempdata также является объектом словаря, который остается на время запрос http. Таким образом, TempData можно использовать для поддержания данных между одним действие контроллера к другому действию контроллера.

данных tempdata используется для проверки значений null каждый раз. Данных tempdata содержать два метода keep () и peek () для поддержания состояния данных из одного действие контроллера для других.

, когда TempDataDictionary объект считывается в конце по запросу марок как удаление текущего объекта чтения.

на keep () и peek () метод используется для чтения данных без удаления текущий объект чтения.

можно использовать Peek () когда вы всегда хотите держать / предотвратить значение для другой запрос. Вы можете использовать Keep () для предотвращения/удержание значения зависит от дополнительной логики.

перегрузка в TempData.Заглядывать() & Данных tempdata.Keep (), как указано ниже.

данных tempdata.Keep () есть 2 перегруженных методов.

  1. пустота keep(): это угрожает всем данным, не удаленным при текущем завершении запроса.

  2. пустота keep(ключ строки) : сохраняйте конкретный элемент в TempData с помощью name.

данных tempdata.Peek () нет перегруженный метод.

  1. объект peek(ключ строки) : возврат объекта, содержащего элементы с определенным ключом, без создания ключа для удаления.

пример для возвращаемого типа TempData.Keep () & TempData.Методы Peek (), как показано ниже.

общественная недействительным Keep(ключ строки ) { _retainedKeys.Add (key);}

объект Peek(ключ строки ) { объект value = значения; возвращаемое значение; }


разве они оба не сохраняют значение для другого запроса?

Да, они делают, но когда первый 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
}