私は RedFilter の一般的な回答に 100% 同意しますが、特に ASP.NET MVC に関連するコードをいくつか投稿したかったのです。
Post/Redirect/Get (PRG) パターンを使用して、二重ポストバックの問題を解決できます。
この問題を図で示します。

ユーザーが更新を押すと、ブラウザは最後に行ったリクエストを再送信しようとします。最後のリクエストが投稿だった場合、ブラウザはそれを試みます。
ほとんどのブラウザーは、これが通常ユーザーが望んでいることではないことを認識しているため、自動的に次のように尋ねます。
Chrome - 入力した情報を探しているページ。そのページに戻ると、実行したアクションが繰り返される可能性があります。続けたいですか?
Firefox - このページを表示するために、Firefox は以前に実行されたアクション (検索や注文の確認など) を繰り返す情報を送信する必要があります。
Safari - もう一度フォームを送信してもよろしいですか? このページを再度開くには、Safari がフォームを再送信する必要があります。これにより、重複した購入、コメント、またはその他のアクションが発生する可能性があります。
インターネットエクスプローラ- Web ページを再度表示するには、以前に送信した情報を Web ブラウザーが再送信する必要があります。購入を行っていた場合は、取引の重複を避けるために [キャンセル] をクリックしてください。それ以外の場合は、[再試行] をクリックして Web ページを再度表示します。
しかし、PRG パターンは、クライアントにリダイレクト メッセージを送信することで、これを完全に回避するのに役立ちます。そのため、ページが最終的に表示されたときに、ブラウザが最後に実行した要求は、新しいリソースに対する GET 要求でした。
これは、MVC のパターンの実装を提供するPRG に関する優れた記事です。サーバー上で非べき等アクションが実行された場合にのみ、リダイレクトに頼る必要があることに注意することが重要です。つまり、有効なモデルがあり、実際に何らかの方法でデータを保持している場合は、リクエストが誤って 2 回送信されないようにすることが重要です。ただし、モデルが無効な場合は、現在のページとモデルを返して、ユーザーが必要な変更を加えることができるようにする必要があります。
コントローラーの例を次に示します。
[HttpGet]
public ActionResult Edit(int id) {
var model = new EditModel();
//...
return View(model);
}
[HttpPost]
public ActionResult Edit(EditModel model) {
if (ModelState.IsValid) {
product = repository.SaveOrUpdate(model);
return RedirectToAction("Details", new { id = product.Id });
}
return View(model);
}
[HttpGet]
public ActionResult Details(int id) {
var model = new DetailModel();
//...
return View(model);
}