0

我想下载一个 .CSV 并将用户重定向到另一个页面。

这是我的代码

    protected void btnExport_Click(object sender, EventArgs e)
    {
        string attachment = "attachment; filename=" + Request.QueryString["exportName"] + ".csv";
        HttpContext.Current.Response.Clear();
        HttpContext.Current.Response.ClearHeaders();
        HttpContext.Current.Response.AddHeader("content-disposition", attachment);
        HttpContext.Current.Response.ContentType = "application/ms-excel";

        //CODE TO WRITE CSV
        List<Company> companies = (List<Company>)Session["SelectedCompanies"];
        foreach (Company company in companies)
        {
            HttpContext.Current.Response.Write(company.Name + ";");
            HttpContext.Current.Response.Write(Environment.NewLine);
        }



        HttpContext.Current.Response.Redirect("otherpage.aspx", true);


    }

但不幸的是,它只进行重定向而不是下载 .CSV。

如果我替换HttpContext.Current.Response.Redirect("otherpage.aspx", true);HttpContext.Current.Response.End();,那么它只会下载 .CSV 而不是重定向。

但我想两者兼得。

4

3 回答 3

2

据我所知,这两个操作无法在一个请求中完成,要么重定向用户要么给文件。试着用两个动作来代替。

于 2012-04-06T07:03:25.020 回答
1

对于这种情况,我要做的是:

  1. 隐藏 iframe

    < iframe id="DownloadIFrame" visible="false" width="1" height="1" style="display:none" > </iframe >

  2. 在更改我的页面内容时,给这个 Iframe 提供我下载的 url(如 download.ashx)。

在服务器上

public string DownloadViaIFrame(Page page, Download download)
        {
            string script = string.Format(
            @"
            var IsDownloaded=false;

            domReady(function() {{
                if (document.getElementById('DownloadIFrame')==undefined)
                                alert('DownloadIFrame not found');
                            else
                            {{
                                if (!IsDownloaded)
                                {{
                                    {0};
                                    IsDownloaded=true;
                                }}
                            }}
            }});", GetJavasciptToDownloadViaIFrame(download));


            ScriptManager.RegisterClientScriptBlock(page, typeof(Page), "download", script, true);

            return script;
        }


 public string GetJavasciptToDownloadViaIFrame(Download download)
        {
            return string.Format("document.getElementById('DownloadIFrame').src='{0}'", GetDownloadLink(download));
        }

这样,Iframe 会在服务器上点击下载脚本并返回要由客户端下载的文件。客户同时看到其页面的内容发生了变化并且很高兴..

祝你好运,

于 2012-04-06T08:14:27.403 回答
0

据我所知,不可能同时采取这两种行动。尝试重定向到 otherPage.aspx,并在 otherPage.aspx 中注入 JavaScript 代码,在 onload 事件中连接到特定的“真实”下载页面

于 2012-04-06T07:18:02.380 回答