生成的文件下载到asp.net mvc后重定向到查看/刷新视图

时间:2013-07-03 13:18:45

标签: asp.net-mvc-3 redirect zip refresh download

我有一个列表视图,我想将所有数据导出为txt文件。根据要求,我需要通过单击“导出”按钮创建3个txt文件。我有一个控制器动作来生成这些文件并将其下载为zip文件。当我单击“导出”按钮时,它将触发操作" ExportFiles"。同时我想重定向到行动" List"因为我想刷新视图。

但问题是我不能同时做这两项任务。那我该怎么办?

这是我的代码;

    public virtual ActionResult List()
    {
        // Code : showing my list
        return view();
    }

    public virtual ActionResult ExportFiles()
    {
        // Code : Generating files
        return new ZipResult(filePath, fileName + ".zip");
        // HERE I WANT TO REFRESH MY VIEW
    }

    public class ZipResult : ActionResult
    {
        private readonly string _filePath;
        public string Filename { get; set; }

        public ZipResult(string filePath, string fileName)
        {
            _filePath = filePath;
            Filename = fileName;
        }

        public override void ExecuteResult(ControllerContext context)
        {
            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var response = context.HttpContext.Response;
            response.ContentType = "application/gzip";
            using (var zip = new ZipFile())
            {
                zip.AddFile(_filePath);
                zip.Save(response.OutputStream);
                var cd = new ContentDisposition
                {
                    FileName = Filename,
                    Inline = false
                };
                response.Headers.Add("Content-Disposition", cd.ToString());
            }
        }

    }

2 个答案:

答案 0 :(得分:0)

相反,不可能在一个响应上同时进行刷新和文件下载。 当您尝试时,您将获得异常,例如“在发送HTTP标头后无法重定向”。

您必须稍微调整一下策略,例如:

  • 单击“导出”按钮后,JS / jQuery在某些超时后手动刷新页面。
  • 返回带有额外元刷新标记的页面,该标记将重定向到下载网址: <meta http-equiv="refresh" content="5,url=DownloadFile.aspx" />

希望它有所帮助。

答案 1 :(得分:0)

由于您的导出将返回一个文件,因此您只需刷新您从(您的列表)开始的视图。如果是这种情况,那么我所做的就是在选择下载按钮后几秒钟刷新页面(我这样做,以便视图显示更新的下载计数和日期)。

在视图(您的列表)中,我通常会在运行类似于下面的脚本的下载按钮中添加onclick事件。其他一切都保持不变。

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