Недавно я просмотрел его исходный код, чтобы узнать, как работает TempData.
Таким образом, срок службы tempdata довольно необычен, так как это только один запрос. Для этого он поддерживает 2 HashSet для управления ключами, а также словарем данных:
private Dictionary<string, object> _data;
private HashSet<string> _initialKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
private HashSet<string> _retainedKeys = new HashSet<string>(StringComparer.OrdinalIgnoreCase);
Когда вы читаете некоторые данные с помощью индексатора или метода TryGetValue, он удаляет этот ключ из коллекции _initalKeys.
public bool TryGetValue(string key, out object value)
{
_initialKeys.Remove(key);
return _data.TryGetValue(key, out value);
}
На данный момент фактический словарь, содержащий данные, не поврежден. Вот почему мы можем читать одни и те же данные последовательно без каких-либо проблем. Он только удаляет ключ из коллекции _initialKeys, помечая его как подлежащий удалению при сохранении данных.
Если вы хотите, чтобы ваши значения в TempData сохранялись дольше, вы можете использовать методы Peek и Keep. Что делает Peek, так это возвращает значение, не удаляя его из _initialKeys:
public object Peek(string key)
{
object value;
_data.TryGetValue(key, out value);
return value;
}
Кроме того, вы можете вызвать метод Keep. Точно так же он не манипулирует данными напрямую, а просто помечает ключ как сохраняемый, добавляя его в коллекцию _retainedKeys.
public void Keep(string key)
{
_retainedKeys.Add(key);
}
И, наконец, он сохраняет данные (по умолчанию в Session), вызывая метод Save провайдера:
public void Save(ControllerContext controllerContext, ITempDataProvider tempDataProvider)
{
_data.RemoveFromDictionary((KeyValuePair<string, object> entry, TempDataDictionary tempData) =>
{
string key = entry.Key;
return !tempData._initialKeys.Contains(key)
&& !tempData._retainedKeys.Contains(key);
}, this);
tempDataProvider.SaveTempData(controllerContext, _data);
}
Таким образом, будут сохранены только те данные, которые остались в коллекции _initialKeys (непрочитанные), и те, которые специально указаны для сохранения (ключи в коллекции _retainedKeys). Отсюда и срок службы!
Ссылка: исходный код TempDataDictionary
person
Volkan Paksoy
schedule
10.09.2015