Pregunta

Tengo un formulario que inicia un Response.Redirect para descargar un archivo una vez completado. También quiero ocultar el formulario y mostrar un panel de "agradecimiento" antes de que se realice la redirección, sin embargo, parece que el motor asp.net simplemente realiza la redirección sin hacer las 2 tareas anteriores en el siguiente código:

if (success)
                {
                    lblSuccessMessage.Text = _successMessage;
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

                if(success)
                    Response.Redirect(_downloadURL); 

¿Alguna idea de cómo puedo forzar la actualización de la página antes de que comience la Redirección?

Montones de gracias Greg

¿Fue útil?

Solución

if (success)
                {
                    lblSuccessMessage.Text = _successMessage;
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

                if(success) {
                    Threading.Thread.Sleep(200)
                    Response.Redirect(_downloadURL);
                }

Puede forzarlo a esperar antes de redireccionar al hacer que el hilo esté inactivo.

La mejor opción, y la más fácil de usar, es permitir que el usuario continúe solo agregando un botón. Por ejemplo, puedes hacer lo siguiente:

if (success)
                {
                    lblSuccessMessage.Text = _successMessage + "<br /><INPUT TYPE='button' VALUE='Continue...' onClick='parent.location='" + _downloadURL + "'/>";
                    showMessage(true);                        
                }
                else
                {
                    lblSuccessMessage.Text = _failureMessage;
                    showMessage(false);
                }

Otros consejos

Necesitas algún código del lado del cliente para hacer la redirección.

Mi preferencia sería incrustar algunos javascript para hacer la redirección.

Entonces, oculte el formulario, muestre el mensaje y (en el nivel más burdo) use un control literal para agregar un texto como este a la página.

<script>
    location.href = "http://otherServerName/fileToDownload";
</script>

Es posible que este redireccionamiento ocurra antes de que la página haya tenido un cambio para mostrar, en cuyo caso, intente esto en la etiqueta del cuerpo de su HTML (tenga en cuenta los diferentes tipos de citas):

<body onload='location.href="http://otherServerName/fileToDownload";'>

Recuerde que todas las publicaciones devuelven una nueva página al cliente, no solo cambiando algunas propiedades en la página actual (incluso si ASP.NET se esfuerza por fingir que es como un formulario de Windows)

Personalmente, prefiero tener una página separada para cada etapa del proceso, en lugar de tratar de hacer todo en una página mostrando / escondiendo los distintos bits, pero podría estar totalmente fuera de lugar.

EDITAR: si han deshabilitado javascript, puedes proporcionar un enlace para descargar el archivo.

No puede, porque esta acción ocurre en el servidor antes de que se envíe de nuevo al cliente. Si está intentando enviar un archivo a un usuario, puede transmitirlo mediante Response.Write (). Esto los mantendrá en la página actual para que pueda mostrarles el mensaje y recibirán el aviso de descarga.

el búfer es una matriz de bytes de un archivo

Response.AddHeader("Content-disposition", "attachment; filename=" & myUserFriendlyFileName)
Response.ContentType = "application/octet-stream"
Response.OutputStream.Write(buffer, 0, buffer.Length)

Directamente en asp.net no puedes hacer esto, pero una forma de evitarlo es usar JS (como se publica aquí), o puedes usar un IFrame que carga el archivo para descargarlo. El usuario verá el agradecimiento. , luego el diálogo Abrir / guardar ...

Ocúltelo en el lado del cliente con javascript y luego realice la redirección, o haga dos devoluciones: la primera devolución de datos para ocultar el formulario y mostrar el agradecimiento, y la segunda para hacer el redireccionamiento una vez que el agradecimiento se haya procesado la pantalla.

O, podría hacer una ventana de javascript. abrir en lugar de una redirección que apunte al destino después de que se complete la devolución de datos y la ocultación del formulario.

¿Tal vez enviar un Encabezado de Redireccionamiento manualmente, con un número de segundos de espera, es el camino a seguir?

Response.AddHeader("Redirect", "3; URL=" + _downloadURL")

EDIT

Después de leer tu pregunta de nuevo, es posible que te haya entendido mal un poco.

Parece que quieres retrasar todo el proceso para que " Gracias " panel se puede mostrar. Eso te deja dos posibilidades:

  • O confía en JavaScript para mostrar el panel y retrasar el formulario POST. El servidor puede redirigir inmediatamente con Response.Redirect () . Esta es la forma más moderna de hacerlo.
  • O quieres ser completamente independiente de JavaScript. En este caso, debe hacer que el servidor muestre un intermediario " Gracias; haga clic aquí para continuar " página en el formulario POST, y use el método de encabezado de redireccionamiento a través de Response.AddHeader () para hacer que esa página desaparezca automáticamente. Esto es un poco anticuado pero confiable.

Realmente no puedes tener una combinación de ambos, porque eso sería inconsistente para aquellos usuarios que tienen JavaScript desactivado.

Terminé haciendo la sugerencia abrudtkuh, simplemente agregando un enlace al mensaje exitoso ... También implementaré un redireccionamiento de javascript para iniciar automáticamente la descarga, pero no quería depender únicamente de javascript, por lo tanto botón que se muestra en la página.

Gracias por los consejos a todos, ¡todos ustedes rockean!

saludos greg

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