C# 在C中调用Response.End()后重定向到另一页#

C# 在C中调用Response.End()后重定向到另一页#,c#,web-applications,gridview,response,response.redirect,C#,Web Applications,Gridview,Response,Response.redirect,我正在将gridview导出到excel,在web应用程序中使用.Net 4.0,加载页面时需要生成文件,然后将页面重定向到调用页面。我遇到问题,因为我要导出到excel的代码如下: gvSummary.Style.Add("font-size", ".6em"); Response.Clear(); string attachment = "attachment; filename=filename.xls"; Response.ClearContent();

我正在将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()之后,我会得到文件,但没有重定向


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

我建议添加重定向标题。大概是这样的:

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

其中3是延迟时间,index.html是您需要重定向到的url。问题是响应。End()将页面的最后一位发送到客户端以完成请求。在您的情况下,请求包含该文件


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

您不能同时打开这两个页面,因此您可能希望尝试在新窗口中设置指向生成的xls文件的链接,或将其设置为JavaScript中iframe的源:

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>

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

因此,我在主页中添加了以下代码:

string strScript = "<script language='javascript'> window.open('CommonDownload.aspx','Report');</script>";
ScriptManager.RegisterStartupScript(Page, this.GetType(), "clientScript", strScript, false);
Response.Redirect("Page.aspx");
string strScript=“window.open('CommonDownload.aspx','Report');”;
ScriptManager.RegisterStartupScript(第页,this.GetType(),“clientScript”,strScript,false);
重定向(“Page.aspx”);
然后在我的CommonDownload页面的Page_Load方法中添加了下载代码。我在整个会话中传递了CommonDownload页面中所需的一些信息。

我在链接中添加了
target=“\u blank”
。因此,当它在一个新窗口中打开时,它会将excel工作表发送到浏览器,并关闭页面,因为在
Response.End()之后它没有其他事情要做


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

一旦客户端单击调用此方法,它将自动刷新

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

由于请求的结果是一个xls文件而不是html,这真的有效吗?我想是的。因为首先HTTP是用来传递响应的。在本例中,HTTP包看起来像一组头文件,后跟二进制数据(xls文件)。在某些情况下,有必要将contnt type设置为application/octet stream,但这取决于我们需要什么样的结果。。尝试在Response.ClearContent()之后直接设置Refresh标头,因此它必须是要更新的第一个标头set@EvanGWatkins我想问题出在你使用的流程上,请看我的答案。这太棒了,伊利亚。我已经寻找这个答案两个小时了。