【问题标题】:Redirecting to another page after Response.End() has been called in C#在 C# 中调用 Response.End() 后重定向到另一个页面
【发布时间】:2021-03-26 22:45:09
【问题描述】:

我正在将 gridview 导出到 excel,在 Web 应用程序中使用 .Net 4.0,在页面加载时需要生成文件,然后将页面重定向到调用页面。我遇到了问题,因为我要导出到 excel 的代码如下:

gvSummary.Style.Add("font-size", ".6em");
    Response.Clear();
    string attachment = "attachment; filename=filename.xls";
    Response.ClearContent();
    Response.AddHeader("content-disposition", attachment);
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    StringWriter sw = new StringWriter();
    HtmlTextWriter htw = new HtmlTextWriter(sw);
    gvSummary.GridLines = GridLines.Horizontal;
    gvSummary.RenderControl(htw);
    Response.Write(sw.ToString());
    Response.End();

我知道如果我将 Response.Redirect() 放在 .End() 之前,我将被重定向,但文件永远不会生成,如果我将 Response.Redirect() 放在 .End() 之后,我获取文件但没有重定向。

上面编写的代码在生成文件时工作得很好,但是在生成文件后,我仍然无法看到我的加载动画,因为我无法跳出页面。有什么想法吗?

【问题讨论】:

    标签: c# web-applications gridview response response.redirect


    【解决方案1】:

    我建议添加一个重定向标头。像这样的:

    Response.AddHeader("Refresh", "3; url=index.html");
    

    其中 3 是延迟时间,index.html 是您需要重定向到的网址

    【讨论】:

    • 既然请求的结果是一个xls文件而不是html,那真的可以吗?
    • 我认为是的。因为首先使用 HTTP 来传递响应。在这种情况下,HTTP 包看起来像一组标头,后跟二进制数据(xls 文件)。在某些情况下,还需要将 contnt 类型设置为 application/octet-stream 但这取决于我们需要什么样的结果
    • hmm.. 尝试在 Response.ClearContent() 之后直接设置 Refresh 标头,因此它必须是要设置的第一个标头
    • @EvanGWatkins 我认为问题出在您使用的流程中,请参阅我的回答。
    • 这太棒了 ILya。我一直在寻找这个答案 2 小时。
    【解决方案2】:

    问题是 Response.End() 将页面的最后一位发送到客户端以完成请求。在您的情况下,请求包含该文件。

    一种可能的解决方案是打开一个新页面进行下载并将重定向保留在当前页面中。

    【讨论】:

      【解决方案3】:

      我将target="_blank" 添加到将我带到该页面的链接中。因此,当它在新窗口中打开时,它会将 excel 工作表发送到浏览器,并关闭页面,因为它在 Response.End(); 之后无事可做

      希望这会有所帮助。为我工作。

      【讨论】:

        【解决方案4】:

        您不能同时打开,因此您可能想尝试在新窗口中设置指向生成的 xls 文件的链接或作为 iframe 的源

        【讨论】:

          【解决方案5】:

          在 JavaScript 中:

          function refresh() { document.location.reload(true); }
          

          按钮:

          <td valign="top" style=" width:100px ">
          <asp:Button runat="server" ID="btnX" Text="X" CssClass="ui-button ui-widget ui-state-default ui-corner-all ui-button-text ui-state-hover" OnClientClick="refresh();"  Width="180px" />
          </td>
          

          【讨论】:

            【解决方案6】:

            我尝试通过 ScriptManager 打开一个单独的页面,该页面将在我的原始页面中进行重定向时下载我的文件。

            所以我在主页中添加了以下代码:

            string strScript = "<script language='javascript'> window.open('CommonDownload.aspx','Report');</script>";
            ScriptManager.RegisterStartupScript(Page, this.GetType(), "clientScript", strScript, false);
            Response.Redirect("Page.aspx");
            

            然后在我的CommonDownload页面的Page_Load方法中添加下载代码。我通过会话在 CommonDownload 页面中传递了一些我需要的信息。

            【讨论】:

              【解决方案7】:

              OnClientClick 调用此方法会自动刷新。

               function PageRefresh() {
                      setTimeout(function () {
                          window.location.reload(1);
                      }, 5000);
                  }
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2019-01-24
                • 2017-06-08
                • 2019-02-23
                • 1970-01-01
                • 2017-03-04
                • 1970-01-01
                • 2011-06-02
                相关资源
                最近更新 更多