Pregunta

Estoy usando el PRG patrón para evitar múltiples envío del formulario.Tiene, sin embargo, un serio inconveniente: no se puede simplemente echo el mensaje de confirmación para el usuario (obviamente, el usuario no ve la página, será redirigido a otro).

¿Cuáles son las soluciones a este problema?Yo conozco a dos de ellos, pero ninguno de ellos parece perfecto.

  • Usar un URL de redirección, como: http://example.com/?msg=data-saved.Es apátrida, así que creo que es bastante fiable.Pero crea problemas cuando el usuario copia el enlace, marcadores, etc.
  • Almacenar en una variable de sesión/cookie, y comprobar en cada carga de página.Si se establece, claro y mostrar el mensaje.Parece bien, pero no estoy seguro acerca de esto — se basa fuertemente en las cookies, resulta un poco más complicado.

O tal vez hay otras maneras yo no sé?Una combinación de sesiones y los parámetros de la URL?No sé.

¿Cuál es la mejor manera en su opinión?La que se tiene menos inconvenientes?¿Cuáles son los pros y los contras?

¿Fue útil?

Solución

Casi todos los sitios web que permite a los usuarios iniciar sesión hace por confiar en una cookie. No es una solución perfecta, pero es lo mejor que tenemos.

También manejo de sesión es una de esas cosas que un marco de desarrollo web que normalmente toma el cuidado de usted.

Otros consejos

Hay varios otros desbordamiento de la pila de preguntas que tocan en esto, aunque no creo que ninguna de resumir el problema claramente.He aquí unas cuantas:

La mayoría de las soluciones están basadas en la sesión o más graves inconvenientes (por ejemplo, insertar el mensaje en el querystring).

Si usted no puede garantizar que usted tendrá sesiones, otro (muy costoso) es el método para redirigir a los diferentes puntos de vista dependiendo del resultado del envío del formulario.Por ejemplo, usted puede redirigir a EditWidgetView, EditWidgetSaveSuccessfulView, o EditWidgetSaveErrorView (o tal vez simplemente no redirigir de errores).En algunos lenguajes y frameworks, esto es poco práctico, hasta el punto de hacer que se le da a mostrar la confirmación / mensajes de error en todos, pero en otros puede ser la pena.

Si no quiere depender de sesiones por cualquier razón usted podría utilizar un / URL personalizada Obtener variable y luego, si esa variable está presente, compruebe las refieren. Si la referencia es correcta, a continuación, mostrar el mensaje. Sí, esto se suma la dependencia de refiere de ser enviado con el fin de mostrar el mensaje de confirmación, pero por lo demás está confiando en las sesiones (que mientras fiable, no son 100% perfecto para todas las soluciones tampoco.)

Y, honestamente, algunos sitios de gran tamaño que son normalmente bastante bueno de este tipo de cosas sólo se adhieren a "actiondone = true" en la url. (Me he dado cuenta de Facebook lo hace en algunos lugares.)

Depende de qué plataforma se está ejecutando en.

Ruby on Rails llama este flash [: aviso] = "Se llevó a cabo su acción", ASP.NET MVC llama a esto TempData [ "aviso"] = "Se llevó a cabo su acción" ...

Básicamente simplemente almacenar datos en HttpSession únicamente para un solo viaje redondo. De esta manera usted puede recuperar los datos en otra solicitud web.

El venir muy tarde para esta discusión ..

Se puede usar una combinación de las dos opciones propuestas.

Después de la solicitud POST se redirige al cliente (303) a una dirección URL que indica que podría haber un mensaje de respuesta para esta solicitud:

Client: GET  http://example.com/foo.cgi
Server: 200  Ok

Client: POST http://example.com/bar.cgi
Server: 303  http://example.com/foo.cgi?msg=true

Si el argumento es msg true el mensaje será buscado en la sesión y (si se encuentra) incluido en la respuesta al cliente.
Si el ! true argumento es <=> (o no está presente), la etapa de búsqueda se omite.

Con esta solución, se evita que el mensaje real que se está en la URL, la URL sólo indica que podría haber un mensaje. También, el mensaje sólo aparece cuando es necesario (= cuando se encuentran en la sesión).

Otra ventaja es que esta solución también permite adecuados efectivo-controles que deben incluirse con las respuestas HTTP.

Yo uso el método variable de sesión. Yo no me gusta mucho la incorporación de mensajes de error para la exhibición en la URL, especialmente con los problemas URL ahorro / compartición de nota, y me gusta que si el usuario vuelve a cargar la página de destino que va a ser una instancia limpia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top