Кнопка браузера назад и двойной ввод данных

Я следую шаблону PRG, чтобы избежать проблемы с повторной отправкой формы при обновлении страницы. Это методы действий:

   public ViewResult AddDcoument(){
      .....
      return View();
   }

   [HttpPost]
   public RedirectToRouteResult SaveDocument(Document doc){
      //save the document
      return RedirectToAction("ViewDocument",new { docId =doc.DocID});
   }

   public ViewResult ViewDocument(string docID){
      Document doc=GetDocumentByID(docID);
      return View(doc);
   }

Когда я нажимаю кнопку "Отправить", документ сохраняется, и меня перенаправляют на действие ViewDocument, что помогает предотвратить повторную отправку формы при обновлении страницы. Но есть еще одна проблема, проблема в том, что я все еще могу нажать кнопку "Назад" браузера, которая вернет меня к форме ввода данных со всеми оставшимися ранее введенными данными, и я могу легко нажать "Отправить" еще раз, что означает повторение ввода. Теперь можно сказать, что мне нужно что-то уникальное для записи, которая не позволит сохранить дубликат на сервере. На самом деле он у меня есть, и это DocumentID, но он назначается автоматически, а не пользователем. Так как вы справляетесь с этим делом?

ОБНОВЛЕНИЕ: я действительно нашел способ обойти эту проблему. Согласно этому блогу и многим другим SO-темам, я должен предоставить следующий заголовок Http, чтобы отключить кэширование в браузере:

Cache-Control: no-cache, max-age=0, must-revalidate, no-store

Я пробовал оба следующих способа:

Инкапсулированный, ООП способ:

var cache=Response.Cache;
cache.SetExpires(DateTime.UtcNow.AddDays(-1));
cache.SetValidUntilExpires(false);
cache.SetRevalidation(HttpCacheRevalidation.AllCaches);
cache.SetCacheability(HttpCacheability.NoCache);
cache.SetNoStore();

И просто добавив строку заголовка:

Response.AppendHeader("Cache-Control", "no-cache, max-age=0, must-revalidate, no-store");

Я попытался добавить их как в метод GET, который отображает форму, так и в метод POST, который отправляет форму. Но все же входные данные формы повторно заполняются из кэша.

0 ответов

Другие вопросы по тегам