Кнопка браузера назад и двойной ввод данных
Я следую шаблону 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, который отправляет форму. Но все же входные данные формы повторно заполняются из кэша.