【问题标题】:Redirecting a page after a PDF download下载 PDF 后重定向页面
【发布时间】:2021-07-13 02:49:58
【问题描述】:

我有一个 aspx(比如 1.aspx)页面,我首先从该页面下载 pdf 文件,然后我想重定向到一些 Thanks.aspx 页面。代码是这样的:

protected void btnSubmit_Click(object sender, EventArgs e)
{
    string pathId = string.Empty;
    if (Page.IsValid)
    {
        try
        {    
            pathId = hidId.Value;
            DownloadPDF(pathId);                        

            Response.Redirect("Thanks.aspx");
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}



protected void DownloadPDF(string pathId)
{
    if (!(string.IsNullOrEmpty(pathId)))
    {
         try
        {
            Response.ContentType = "application/pdf";
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + pathId + ".pdf");
            string path = ConfigurationManager.AppSettings["Pdf_Path"].ToString() + "\\" + pathId.Trim() + ".pdf";
            Response.TransmitFile(path);                   
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            HttpContext.Current.ApplicationInstance.CompleteRequest();
        }
    }
}

问题是,文件保存对话框正常出现,我也可以下载文件,但它没有被重定向到Thanks.aspx页面。

如何解决?

【问题讨论】:

    标签: c# asp.net redirect download


    【解决方案1】:

    如果文件是刚刚下载的,没有做任何预处理,你可以试试下面的方法:

    Response.AddHeader("Refresh", "12;URL=nextpage.aspx");
    

    数字是刷新完成前的秒数:)

    【讨论】:

    • 这完全可以解决问题,无需使用 javascript 来处理重定向。太棒了!
    • 此方法更适合用于在任何操作后,延迟后转发或重定向到另一个页面的任何情况。这也不会导致 Response.Redirect 中止线程可能导致的错误。如果框架不是一个好的解决方案,那么绝对应该使用这个解决方案。
    • 我同意 MichaelBrennt 和 Speuline 的观点。在 Firefox 中也不起作用。或者我只是很烂。
    • 使用 chrome 版本 77.0.3865.90(官方构建)(64 位)
    【解决方案2】:

    我发现将 PDF 下载页面放在 iframe 中更容易。这样,您只需将 iframe 源指向 PDF 下载页面,即可在客户端激活 PDF 下载。之后,您可以移动到新页面,或者只在包含 iframe 的页面上显示感谢文本。

    【讨论】:

      【解决方案3】:

      在 HTTP 中,一个请求只能有一个响应。由于第一个响应是PDF文件,秒响应(即重定向)无法实现。

      您可以尝试通过重定向到thanks.aspx 来重新设计这两个页面,并让thanks.aspx 自动开始下载。

      【讨论】:

      • 我什至尝试过这种技术,但同样的问题仍然存在
      【解决方案4】:

      Response.Redirect 实际上向浏览器发送了一个响应,基本上说该资源已移动到其他一些 URL。但是,您也尝试在响应中发送文件,因此这两件事可能相互冲突。尝试发回一些 JavaScript,将它们发送到您也想发送它们的页面,而不是使用 Response.Redirect。

      ScriptManager.RegisterStartupScript(Me, Me.GetType(), "redirectScript", "window.location.href='whateverurlhere.aspx';", True)
      

      【讨论】:

        【解决方案5】:

        请参阅此已接受答案中提到的文章:https://stackoverflow.com/a/11018277/1037864 (直接链接:http://gruffcode.com/2010/10/28/detecting-the-file-download-dialog-in-the-browser/

        这个想法是设置一个cookie并将其与文件一起发送。同时,您让等待页面在等待 cookie 到达时阻塞 UI。

        【讨论】:

          【解决方案6】:

          我尝试了很多东西(比如这里的想法),但对我的特殊情况没有任何效果。最后对我来说,我使用了一种方法,我的 C# 设置一个 JavaScript 查找的 cookie,并相应地禁用表单按钮/等,直到检测到 cookie。

          我的代码在这里,以防有人认为此解决方案可能对您有用: https://gist.github.com/cemerson/9811a384d7f41bc683b2bd9ed4bf5b17

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2019-07-05
            • 1970-01-01
            • 2014-09-06
            • 2012-02-08
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多