Подтвердить что ты не робот

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.

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

4b9b3361

Ответ 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

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

TempData​​strong > используется для проверки нулевых значений каждый раз. 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 мог быть доступен для следующего запроса, как в примере выше.