#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)]
— Там тоже существует такое же поведение.