Asp.net mvc 浏览器后退按钮和重复数据输入

Asp.net mvc 浏览器后退按钮和重复数据输入,asp.net-mvc,http-headers,back-button,duplicates,no-cache,Asp.net Mvc,Http Headers,Back Button,Duplicates,No Cache,我遵循PRG模式,以避免刷新页面时表单重新提交问题。以下是行动方法: public ViewResult AddDcoument(){ ..... return View(); } [HttpPost] public RedirectToRouteResult SaveDocument(Document doc){ //save the document return RedirectToAction("ViewDocum

我遵循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
我尝试了以下两种方法:

封装的OOP方式:

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方法中。但是表单输入仍然是从缓存中重新填充的。

由于链接,描述了一种可能的解决方案,即cookie方法。