我按照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,但它是自动分配的,而不是用户输入的。那你怎么处理这个案子呢?
更新:我实际上找到了绕过这个问题的方法。根据{{3}}和许多其他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方法。但是仍然从缓存中重新填充表单输入。