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.
Условие 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 перегруженных методов.
пустота keep(): это угрожает всем данным, не удаленным при текущем завершении запроса.
пустота keep(ключ строки) : сохраняйте конкретный элемент в TempData с помощью name.
данных tempdata.Peek () нет перегруженный метод.
- объект 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
}