【问题标题】:Redirect to view / Refresh view after generated files are downloaded asp.net mvc下载生成的文件后重定向到查看/刷新视图 asp.net mvc
【发布时间】:2013-07-03 13:18:44
【问题描述】:

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

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

这是我的代码;

    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());
            }
        }

    }

【问题讨论】:

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


    【解决方案1】:

    而是不可能在一个响应上同时进行刷新和文件下载。 当您尝试时,您将收到“发送 HTTP 标头后无法重定向”之类的异常。

    你必须稍微调整你的策略,f.e.:

    • 点击导出按钮后,通过 JS/jQuery 超时后手动刷新页面。
    • 返回带有附加元刷新标签的页面,该标签将重定向到下载网址: <meta http-equiv="refresh" content="5,url=DownloadFile.aspx" />

    希望对你有帮助。

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-06
        • 1970-01-01
        • 2019-09-28
        • 1970-01-01
        • 2019-07-05
        • 2010-10-23
        相关资源
        最近更新 更多