TempData держать () против просмотра ()

В чем разница между 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.

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


person Ghasan غسان    schedule 21.01.2014    source источник
comment
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


Ответы (5)


Когда объект в 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
comment
Когда действительно происходит удаление? Итак, если он помечен для удаления после чтения, а затем я выполняю некоторые другие действия и решаю использовать сохранение, будет ли он гарантированно существовать, пока я инициировал перенаправление? - person eaglei22; 03.06.2015
comment
Он будет удален в конце текущего запроса, после выполнения результата и всех фильтров. Это при условии, что вы используете базовый класс контроллера, проверьте использование TempData.Save там - person Daniel J.G.; 03.06.2015

Только что закончил понимать Peek and Keep, и поначалу у меня была такая же путаница. Путаница возникает из-за того, что TempData ведет себя по-разному в разных условиях. Вы можете посмотреть это видео, которое объясняет Keep and Peek с демонстрацией https://www.facebook.com/video.php?v=689393794478113

Tempdata помогает сохранить значения для одного запроса и ТАКЖЕ МОЖЕТ сохранить значения для следующего запроса в зависимости от 4 условий».

Если мы поймем эти 4 пункта, вы увидите больше ясности. Ниже приведена диаграмма со всеми 4 условиями, прочитайте третий и четвертый пункты, в которых говорится о Peek and Keep.

введите здесь описание изображения

Условие 1 (не прочитано):- если вы установите «TempData» внутри своего действия и если вы не прочитаете его в своем представлении, «TempData» будет сохранен для следующего запроса.

Условие 2 (нормальное чтение): - если вы читаете «TempData» в обычном режиме, как в приведенном ниже коде, он не будет сохраняться для следующего запроса.

string str = TempData["MyData"];

Даже если вы показываете это нормальное чтение, как код ниже.

@TempData["MyData"];

Условие 3 (Чтение и сохранение): - Если вы прочитаете «TempData» и вызовете метод «Сохранить», он будет сохранен.

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

Условие 4 (Peek and Read):- Если вы читаете «TempData» с помощью метода «Peek», они сохранятся для следующего запроса.

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

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

person Shivprasad Koirala    schedule 14.09.2014
comment
так что это означает, что метод «Peek» будет сохраняться для следующего запроса, а метод «Keep» не будет сохраняться для следующего запроса или третьего запроса, я прав? - person Shaiju T; 28.10.2015
comment
@stom Peek пометить ключ для сохранения, чтобы данные сохранялись до следующего запроса. - person Anirudha Gupta; 24.06.2017
comment
хорошо объяснил. - person SamuraiJack; 02.04.2018

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

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

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

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

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

Перегрузка в TempData.Peek() и TempData.Keep(), как указано ниже.

TempData.Keep() имеет 2 перегруженных метода.

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

  2. void keep(string key) : сохранить конкретный элемент в TempData с помощью имени.

TempData.Peek() без перегруженных методов.

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

Пример возвращаемого типа методов TempData.Keep() и TempData.Peek(), приведенный ниже.

public void Сохранить(строковый ключ) { _retainedKeys.Add(key); }

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

person Community    schedule 02.12.2014
comment
Возможный источник для первого абзаца: 10 лучших ASP.NET MVC Вопросы для интервью, TempData также является объектом словаря, который остается на время HTTP-запроса. Таким образом, Tempdata можно использовать для хранения данных между переадресациями, т. е. с одного контроллера на другой. - person ; 08.10.2015

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

Да, но когда первый 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
}
person Zabavsky    schedule 21.01.2014

Метод Keep() помечает указанный ключ в словаре для сохранения

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

когда вы читаете TempData и хотите сохранить для другого запроса, используйте метод keep, чтобы TempData мог быть доступен для следующего запроса, как в приведенном выше примере.

person Cd Patel    schedule 08.09.2019
comment
Этот ответ - на более старые вопросы с многочисленными полезными и правильными ответами - не представляет дополнительной ценности. Пожалуйста, воздержитесь от таких материалов, которые ничего не добавляют к существующему контенту, особенно к более старым вопросам, которые уже приняты и содержат полезные ответы. - person Cindy Meister; 08.09.2019