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