Pergunta

Eu tenho um formulário que arranca um Response.Redirect para baixar um arquivo, uma vez concluída. Eu também quero ocultar o formulário e mostrar um 'obrigado' painel antes de o redirecionamento ocorre, no entanto, parece que o motor asp.net só faz o redirecionamento sem fazer as 2 tarefas antes no código a seguir:

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

                if(success)
                    Response.Redirect(_downloadURL); 

Alguma idéia de como eu pode forçar a página para atualização antes dos pontapés de redirecionamento no ??

Thanks heaps Greg

Foi útil?

Solução

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

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

Você pode forçá-lo a esperar antes de ele redireciona, tornando o sono fio.

A melhor e mais opção de usuário amigável é deixar o usuário continuar por conta própria, adicionando um botão. Por exemplo, você pode fazer o seguinte:

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

Outras dicas

Você precisa de algum código do lado do cliente para fazer o redirecionamento.

A minha preferência seria para incorporar alguns javascript para fazer o redirecionamento.

Assim, ocultar o formulário, exibir a mensagem, e (no nível mais grosseiro) usar um controle literal adicionar algum texto como este para a página.

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

Você pode achar que esse redirecionamento ocorre antes de sua página teve uma mudança para a exibição - em cujo caso, tente isso na tag do corpo do seu HTML (note os diferentes tipos de aspas):

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

Lembre-se que cada posto de volta é realmente servindo-se uma nova página para o cliente, e não apenas mudando algumas propriedades na página atual (mesmo que ASP.NET se esforça para fingir que é como uma janela de formar)

Pessoalmente eu prefiro ter uma página separada para cada fase do processo, em vez de tentar fazer tudo em uma página, mostrando / ocultando os vários pedaços - mas posso estar irremediavelmente fora da data .

EDIT:. Se eles têm javascript disabled, você poderia apenas fornecer um link para baixar o arquivo

Você não pode, porque essa ação acontece no servidor antes de seu enviado de volta para o cliente. Se você está tentando enviar um arquivo para um usuário, você pode transmitir a eles usando Response.Write (). Isto irá mantê-los na página atual de modo que você pode mostrar-lhes a mensagem e eles vão começar o download imediato.

tampão é uma matriz de bytes de um ficheiro

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

Bem em asp.net você não pode fazer isso, mas uma maneira de contornar, quer seja para uso JS (como é postado aqui), ou você pode usar um iframe que carrega o arquivo a ser baixado - o usuário verá o thankyou , então o Open / save diálogo ...

escondê-lo do lado do cliente com javascript e depois fazer o redirecionamento, ou fazer duas postagens: primeira postagem para esconder a forma e mostrar o agradecimento, eo segundo para fazer o redirecionamento uma vez que o agradecimento foi processado para a tela.

Ou, você poderia fazer um javascript window.open em vez de um redirecionamento que aponta para o destino após a postagem e forma esconderijo está concluída.

Talvez enviando um cabeçalho de redirecionamento manualmente, com um número de segundos de espera é o caminho a percorrer para você?

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

Editar

Depois de ler a sua pergunta novamente, eu pode ter entendido mal a você um pouco.

Você parece querer atrasar todo o processo para que um "obrigado" painel pode ser exibido. Isso te deixa duas possibilidades:

  • Ou você confiar em JavaScript para exibir o painel e atrasar a forma POST. O servidor pode então redirecionar imediatamente com Response.Redirect(). Esta é a forma mais moderna de fazê-lo.
  • Ou você quer ser inteiramente independentes de JavaScript. Neste caso você deve fazer a exibição do servidor de um intermediário "Obrigado, clique aqui para ir em" página sobre a forma POST, e usar o método header Redirect via Response.AddHeader() para fazer essa página desaparecem automaticamente. Isto é um pouco antiquado, mas confiável.

Você não pode realmente ter uma combinação de ambos, porque isso seria inconsistente para aqueles usuários que têm JavaScript desligado.

Acabei fazendo a sugestão abrudtkuh, apenas adicionando um link para a mensagem Succeess ... i também irá implementar um redirecionamento javascript para iniciar automaticamente o download, mas eu não queria confiar apenas em javascript, daí a botão que está sendo exibido pela página.

Obrigado pelas dicas todos - todos vocês rocha

aplausos greg

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top