Как я могу предотвратить повторное отображение моего пользовательского уведомления кнопкой «Назад» в браузере?

Я создал систему уведомлений для сайта ASP.NET MVC3, над которым я работал, которая позволяет пользователю узнать, что различные действия, которые они выполняли, были выполнены успешно (сообщение «похлопать по спине»). Решение работает довольно хорошо, но у меня есть одна проблема, которую я хотел бы решить, но я не могу понять, как это сделать.

В контроллере у меня есть следующие примеры методов действий:

<HttpGet()>
Public Function Edit(id As Guid) As ActionResult
    Return View(GetMyViewModel(id))
End Function

<HttpPost()>
Public Function Edit(...) As ActionResult
    ' Save updated ... information

    Me.TempData("UserMessage") = "Data Saved! You are truly an awesome user!"

    ' PRG back to Edit
    Return RedirectToAction("Edit")
End Function

Затем, на мой взгляд (макет бритвы), у меня есть код, который проверяет наличие ключа "UserMessage" в коллекции TempData , и если он существует, я создаю некоторый JavaScript чтобы представить пользователю уведомление, подобное рычанию:

/* This only exists when we have something to show */
$(function () {
    showNotification([the message from TempData]); 
});

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

Пока все хорошо, все работает, как ожидалось. . Пользовательские POST-сообщения для Edit , они RPG возвращаются в Edit , отображается сообщение типа « Данные сохранены! Вы действительно отличный пользователь! » и отклонен.

Если пользователь затем переходит на другую страницу и затем нажимает кнопку «Назад» в браузере, браузер затем копается в своем кэше, в результате чего браузер выполняет тот же JavaScript, показывая пользователю тот же « Данные сохранены! Вы действительно классный пользователь! "еще раз. Это сбивает с толку пользователя, который думает, что, щелкнув кнопку «Назад», он просто сделал что-то, что вызвало еще одно сохранение (или что бы там ни было в сообщении).

Я ищу способ, чтобы уведомление было показанный один раз, я могу каким-то образом предотвратить отображение уведомления - в основном, сделав его "одноразовым" сообщением. Я подумал о следующем:

  • включение Guid в каждое сообщение и использование localStorage для хранения списка отображаемых идентификаторов сообщений, и только если запрошенное сообщение еще не существует в списке отображаемых сообщений, покажите это.
    • Я думал об использовании файла cookie таким же образом, но меня раздражала идея, что файл cookie без нужды отправляется обратно на сервер для будущих запросов, к тому же содержимое файла cookie должно быть тщательно изучено и, вероятно, -сообщение в любом случае.
  • Вместо того, чтобы возвращать сообщение из метода действия, верните Guid , который указывает на сообщение в базе данных. Затем при загрузке страницы AJAX возвращается на сервер, чтобы получить это сообщение. Как только сообщение получено, оно удаляется из базы данных, последующие запросы для этого же сообщения обрабатываются без возврата сообщения.
  • включать Guid в каждое сообщение, а перед отображением сообщения - AJAX back на сервер, чтобы увидеть, было ли уже показано сообщение. Как только сообщение отображается, AJAX возвращается на сервер, чтобы записать, что сообщение было показано.

Все это кажется мне довольно несостоятельным, но меня можно убедить в другом, если кто-то захочет оспорить поддержку одного из них.

] Вещи, которые я пробовал:

  • После закрытия сообщения удаление всех следов элемента DOM.
  • Когда сообщение отображается, установите свойство jQuery .data () в элементе DOM сообщения чтобы указать, что сообщение было показано, затем перед отображением сообщения убедитесь, что поле .data () не существует.

Они не работают, потому что браузер кэширует страницы в точке в время, когда оба этих изменения DOM происходят впоследствии.

В принципе, мне нужен механизм, который мой javascript может проверить, чтобы увидеть, действительно ли ему нужно отображать данное сообщение, и если это так, показать его, но затем пометить сообщение как показано, поэтому, если его снова попросят показать, этого не произойдет. Есть предложения?

5
задан ckittel 3 August 2011 в 22:16
поделиться