Un problema web común es cuando un usuario hace clic varias veces en el botón de enviar de un formulario para que el servidor procese el formulario más de una vez. Esto también puede suceder cuando un usuario presiona el botón Atrás y luego envía un formulario para que se procese de nuevo.¿Qué métodos están disponibles para detener varias devoluciones de un formulario en ASP.NET MVC?
¿Cuál es la mejor manera de evitar que esto ocurra en ASP.NET MVC?
posibilidades como lo veo son:
- deshabilitar el botón después de someter - ahora se pone alrededor de los múltiples clics, pero no la navegación
- Tener la acción de recepción redirigir inmediatamente - navegadores parecen dejar estas redirecciones a cabo de la historia
- colocar una ficha única en la sesión y en la forma - si coinciden procesar la forma - si no borrar el formulario para presentar una nueva
¿Hay más?
¿Existen algunas implementaciones específicas de alguno de estos?
Puedo ver la tercera opción implementada como un ActionFilter con una extensión HtmlHelper de una manera similar a las cosas anti-falsificación.
Esperamos con interés escuchar de usted MVC'ers por ahí.
Una idea interesante, una cosa que agregaría es que debe poner la secuencia en una transacción: 1) verificar nonce 2) proceso 3) eliminar nonce. Si no lo haces atómicamente, tienes una condición de carrera en la que la publicación se puede procesar varias veces, especialmente. si el procesamiento tarda un tiempo en finalizar (y el usuario está impaciente). Una cosa de la que todavía no tengo claro es que si el POST detecta un envío duplicado, ¿qué debería devolverse al usuario? ¿Una página que indica que la publicación está en progreso? – DSO
Yo eliminaría primero la clave nonce y luego haré el procesamiento para mantener las cosas simples. Cómo manejar un engaño es una decisión de diseño y depende de usted. Sin embargo, una respuesta descriptiva de lo que acaba de suceder ayudaría al usuario a apreciar aún más su aplicación web. – aleemb
¿Has visto una implementación de claves nonce en ASP.NET MVC usando ActionFilters quizás? Me imagino que esto haría que la implementación sea muy simple y reutilizable. También podría usar una base de datos o simplemente una variable de sesión. – WooWaaBob