ページが更新されたときのフォームの再送信の問題を回避するために、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 メソッドの両方に追加してみました。ただし、フォーム入力はキャッシュから再入力されます。