ASP.NET TempData не очищается даже после его чтения

У меня есть действие контроллера, похожее на приведенное ниже, TempData был инициализирован моей структурой. Я заметил, что TempData не очищает значение после его чтения, как показано в действии «EmployeeUnderAge».

Когда TempData очищает прочитанные данные?

public class HomeController : Controller
{
    public ActionResult Index(int iD)
    {
        var employeeAge = (int)TempData["Age"];
        RouteData.Values.Add("Age", employeeAge);
        return RedirectToAction("EmployeeUnderAge");
    }

    public ActionResult EmployeeUnderAge(int employeeAge)
    {
        var stillInTempData = (employeeAge == ((int) TempData["Age"]));
        return (stillInTempData) ? View("Index") : View("Error");
    }
}

person Kiran Vedula    schedule 14.09.2015    source источник


Ответы (1)


Ниже приведены некоторые ключевые моменты, которые следует учитывать при использовании временных данных.

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

  2. TempData не всегда удаляет прочитанный элемент. Он удаляет элемент только тогда, когда действие приводит к коду состояния HTTP 200 (ОК) (например, ViewResult/JsonResult/ContentResult и т. д.).

  3. В случае действий, которые приводят к HTTP 302 (например, любые действия по перенаправлению), данные сохраняются в хранилище даже при доступе к ним, что имеет место в моем вопросе. TempData, по-видимому, предназначен для передачи данных различным контроллерам/действиям и, следовательно, не оправдывает очистку во время перенаправления.

person Kiran Vedula    schedule 14.09.2015
comment
Ударь меня! Я бы добавил к этому, что удаление из TempData обычно происходит позже в конвейере ASP.NET после возврата метода в контроллере, поэтому проверка того, сохраняется ли значение в том же методе, может иметь непредсказуемые результаты. TempData обычно используется только для передачи данных между действиями контроллера при использовании перенаправлений. - person JNYRanger; 14.09.2015
comment
Абсолютно верно. Поскольку резервное хранилище является состоянием сеанса ASP.Net, к нему можно получить доступ, пока оно не будет очищено конвейером ASP.Net. - person Kiran Vedula; 14.09.2015