Tôi 100% đồng ý với câu trả lời chung của RedFilter, nhưng muốn đăng một số mã có liên quan cho ASP.NET MVC cụ thể.
Bạn có thể sử dụng số Post/Redirect/Get (PRG) Pattern để giải quyết vấn đề hậu kép.
Dưới đây là một minh hoạ đồ họa của vấn đề:
gì sẽ xảy ra là khi các số truy cập sử dụng làm mới, trình duyệt sẽ gửi lại yêu cầu cuối cùng nó thực hiện. Nếu yêu cầu cuối cùng là một bài đăng, trình duyệt sẽ cố gắng thực hiện điều đó.
Hầu hết các trình duyệt biết rằng đây không phải là điển hình mà người dùng muốn làm, như vậy sẽ tự động hỏi:
Chrome - Các trang mà bạn đang tìm kiếm thông tin đã qua sử dụng mà bạn đã nhập. Quay lại trang đó có thể khiến bạn phải lặp lại bất kỳ hành động nào. Bạn có muốn tiếp tục không?
Firefox - Để hiển thị trang này, Firefox phải gửi thông tin lặp lại bất kỳ hành động nào (chẳng hạn như tìm kiếm hoặc xác nhận đơn đặt hàng) đã được thực hiện trước đó.
Safari - Bạn có chắc chắn muốn gửi lại biểu mẫu không? Để mở lại trang này, Safari phải gửi lại biểu mẫu. Điều này có thể dẫn đến mua hàng trùng lặp, nhận xét hoặc các hành động khác.
Internet Explorer - Để hiển thị lại trang web, trình duyệt web cần phải gửi lại thông tin bạn đã gửi trước đó. Nếu bạn đã mua hàng, bạn nên nhấp vào Hủy để tránh giao dịch trùng lặp. Nếu không, hãy nhấp vào Thử lại để hiển thị lại trang web.
Nhưng mẫu PRG giúp tránh điều này hoàn toàn bằng cách gửi cho khách hàng thông báo chuyển hướng để cuối cùng trang xuất hiện, yêu cầu cuối cùng mà trình duyệt đã thực hiện là yêu cầu GET cho tài nguyên mới.
Đây là một great article on PRG cung cấp triển khai mẫu cho MVC. Điều quan trọng cần lưu ý là bạn chỉ muốn sử dụng chuyển hướng khi hành động không phải là idempotent được thực hiện trên máy chủ. Nói cách khác, nếu bạn có một mô hình hợp lệ và đã thực sự lưu giữ dữ liệu theo một cách nào đó, thì điều quan trọng là phải đảm bảo yêu cầu không được gửi ngẫu nhiên hai lần. Nhưng nếu mô hình không hợp lệ, trang và mô hình hiện tại phải được trả lại để người dùng có thể thực hiện bất kỳ sửa đổi cần thiết nào.
Dưới đây là một điều khiển dụ:
[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);
}
Bạn có thể nhận được nhiều câu trả lời nếu bạn tag nó như là ngôn ngữ-agnostic, như nó không chỉ là ASP.NET MVC mà bị ảnh hưởng, nhưng tất cả các ngôn ngữ và khuôn khổ tương tác với các biểu mẫu web. (Tất nhiên, bạn có thể nhận được mã nếu bạn để lại thẻ ASP.NET MVC ở đó). – Macha