Estoy 100% de acuerdo con la respuesta genérica de RedFilter, pero quería publicar un código relevante específicamente para ASP.NET MVC.
Puede usar el Post/Redirect/Get (PRG) Pattern para resolver el problema de la doble devolución de datos.
Aquí es una ilustración gráfica del problema:
Lo que pasa es que los accesos de los usuarios actualicen, el navegador intenta volver a presentar la última solicitud que hizo. Si la última solicitud fue una publicación, el navegador intentará hacer eso.
mayoría de los navegadores saben que esto no es normalmente lo que el usuario quiere hacer, por lo que pedirán de forma automática:
Chrome - La página que está buscando ha utilizado la información que ha introducido. Volver a esa página puede provocar que se repita cualquier acción que haya realizado. ¿Desea continuar?
Firefox - Para mostrar esta página, Firefox debe enviar información que repita cualquier acción (como una búsqueda o confirmación de pedido) que se haya realizado anteriormente.
Safari - ¿Estás seguro de que quieres enviar un formulario nuevamente? Para volver a abrir esta página, Safari debe volver a enviar un formulario. Esto podría dar lugar a compras duplicadas, comentarios u otras acciones.
Internet Explorer - Para volver a mostrar la página web, el navegador web necesita volver a enviar la información que ha enviado anteriormente. Si estaba haciendo una compra, debe hacer clic en Cancelar en para evitar una transacción duplicada. De lo contrario, haga clic en Reintentar para mostrar la página web nuevamente.
Pero el patrón PRG ayuda a evitar esto por completo mediante el envío al cliente un mensaje de redirección así que cuando finalmente aparece la página, la última solicitud del navegador ejecuta era una petición GET para el nuevo recurso.
Aquí hay un great article on PRG que proporciona una implementación del patrón para MVC. Es importante tener en cuenta que solo desea recurrir a una redirección cuando se realiza una acción que no es idempotent en el servidor. En otras palabras, si tiene un modelo válido y realmente ha persistido en los datos de alguna manera, entonces es importante asegurarse de que la solicitud no se envíe accidentalmente dos veces. Pero si el modelo no es válido, se debe devolver la página y el modelo actuales para que el usuario pueda realizar las modificaciones necesarias.
He aquí un controlador ejemplo:
[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);
}
Usted puede tener más respuestas, si etiquetas como independiente del idioma, como no es solo ASP.NET MVC el que se ve afectado, sino que todos los lenguajes y marcos interactúan con los formularios web. (Por supuesto, puede obtener código si deja allí la etiqueta ASP.NET MVC). – Macha