2010-04-13 45 views
5

tengo un formulario que permite al usuario ingresar los datos y luego enviarlos. si todo funciona bien en este resultado de acción, entonces redireccionaré al usuario a una página de agradecimiento.Cómo manejar el envío de formulario ASP.NET MVC Botón Atrás?

mi problema ahora mismo es que cuando el usuario haga clic en el botón Atrás, podrá volver a la página del formulario y las entradas seguirán allí.

y si el usuario simplemente hace clic en enviar de nuevo, obtendré algunos posibles errores extraños.

por lo que en términos de asp.net mvc, ¿cuál es la mejor manera de manejar a los usuarios que hacen clic en el botón Atrás?

gracias!

Respuesta

1

¿Qué quiere decir con "posibles errores extraños"? Dudo que el usuario vuelva a hacer clic en enviar a menos que quiera publicar exactamente lo mismo otra vez. Si no quieres publicaciones duplicadas, comprueba el contenido en tu base de datos antes de publicarlas.

Si realmente no quieren que la gente la publicación de la misma forma dos veces, pone un número generado aleatoriamente (sólo asegúrese de que es lo suficientemente aleatoria para evitar colisiones, o usar algo así como una combinación de ID de usuario y una marca de tiempo precisa) en un campo oculto, guárdelo con sus datos y verifique que no exista en su base de datos antes de guardar nada.

+0

Como asp.net mvc no tiene estado, pensé que tal vez tenían un nuevo método shebang o la mejor práctica para manejar esto también. – melaos

+0

No me gusta cuando las personas afirman que algún método es "la mejor práctica". –

+0

lol cierto, pero hay hacks feos y luego hay mejores alternativas probadas y probadas para su uso. Trato de evitar lo primero tanto como sea posible. – melaos

6

Esta solución funciona perfectamente para el conjunto del controlador o una acción específica, basta con añadir [NoCache]

/// <summary> 
/// Prevent a controller or specific action from being cached in the web browser. 
/// For example - sign in, go to a secure page, sign out, click the back button. 
/// <seealso cref="https://stackoverflow.com/questions/6656476/mvc-back-button-issue/6656539#6656539"/> 
/// </summary> 
public class NoCacheAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuting(ResultExecutingContext filterContext) 
    { 
     var response = filterContext.HttpContext.Response; 
     response.Cache.SetExpires(DateTime.UtcNow.AddDays(-1)); 
     response.Cache.SetValidUntilExpires(false); 
     response.Cache.SetRevalidation(HttpCacheRevalidation.AllCaches); 
     response.Cache.SetCacheability(HttpCacheability.NoCache); 
     response.Cache.SetNoStore(); 
    } 
} 

Y en el código:

[NoCache] 
[Authorize] 
public class AccountController : Controller 
{ ... } 

Originalmente publicado aquí: MVC Back button issue

Cuestiones relacionadas