Временные данные не становятся пустыми (нулевыми) при нажатии кнопки «Назад» через браузер

#c# #asp.net-mvc #razor

#c# #asp.net-mvc #razor

Вопрос:

Я отправляю сообщение об успешном завершении в response from API to controller и устанавливаю его значение TempData["Message"] , теперь перенаправляя на какой-либо другой метод действия. вот так:

 [HttpPost]
public ActionResult AddFeedbackCategory(IFeedbackCategoryModel modelData)
{
     var message = JsonConvert.DeserializeObject<ApiResponse>(response);
     TempData["Message"] = message.Message;
     return RedirectToAction("CategoryList");
}

[HttpGet]
public ActionResult CategoryList()
{
     var categoryData = JsonConvert.DeserializeObject<List<CategoryModel>>(data);
     return View(categoryData);
}
  

и в view оф CategoryList я написал код примерно так:

   @if (TempData["Message"] != null)
    {
        <div id="snackbar" class="snack_success">@TempData["Message"].ToString() 
        </div>
        TempData["Message"] = null;
    }
  

Это помогает отображать сообщение об успешном завершении (сохраняется в течение 2 секунд) всякий раз, когда я добавляю какую-либо запись в свою систему, подобную этой.

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

Теперь проблема в том, что когда я нажимаю кнопку «Назад», а затем снова возвращаюсь к списку категорий, это сообщение об успешном завершении появляется снова. Почему его значение не становится нулевым? есть ли какая-то конкретная причина или я делаю что-то не так?

Комментарии:

1. Когда вы перенаправляете список категорий, вы каждый раз заполняете TempData[] , вам нужно заполнить TempData[] только в случае успешной вставки. вам не нужно заполнять каждое перенаправление.

2. @NiravVasoya Пожалуйста, посмотрите на мой вопрос еще раз, я внес некоторые изменения, возможно, теперь вы понимаете.

3. Если вы добавите [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*", Location = OutputCacheLocation.None)] в качестве атрибута свою GET конечную точку, а затем повторите попытку, проблема сохранится?

4. @DivyaAgrawal Теперь я видел ваш отредактированный вопрос, приятно знать, что у вас есть разрешение. Спасибо.

Ответ №1:

Допустим, вы переходите со страницы A на страницу B. Затем вы нажимаете Back на страницу B (чтобы вернуться на страницу A). Если вы явно не задали заголовки кэширования на странице A, браузер может решить отобразить старую версию страницы A (которую он отобразил перед переходом на страницу B).

Чтобы решить эту проблему, одним из вариантов является отключение кэширования браузера. Например, используйте это GET для метода действия конечной точки:

 [OutputCache(NoStore = true, Duration = 0, VaryByParam = "*", Location = OutputCacheLocation.None)]
  

Это гарантирует, что при нажатии кнопки «Назад» браузер будет вынужден снова обратиться к серверу для повторного отображения страницы A (вместо того, чтобы просто показывать старую версию страницы A).

Комментарии:

1. Для .NET Core это [ResponseCache(Duration = 0, Location = ResponseCacheLocation.None, NoStore = true)] — Там тоже существует такое же поведение.