asp.net-mvc - 下载生成的文件后重定向/显示 View

标签 asp.net-mvc

我有一个 Controller Action 可以下载一个动态生成的文件:

    public ActionResult DownloadFile()
    {
        var obj = new MyClass { MyString = "Hello", MyBool = true };
        var ser = new XmlSerializer(typeof(MyClass));
        var stream = new MemoryStream();
        ser.Serialize(stream, obj);
        stream.Position = 0;

        Response.Clear();
        Response.AddHeader("Content-Disposition", "attachment; filename=myfile.xml");
        Response.ContentType = "application/xml";

        // Write all my data
        stream.WriteTo(Response.OutputStream);
        Response.End();

        return Content("Downloaded");
    }

仅供引用:

    public class MyClass
    {
        public string MyString { get; set; }
        public int MyInt { get; set; }
    }

这是有效的,文件 (myfile.xml) 已下载。
但是,消息“已下载”不会发送到浏览器。

同样,如果我替换 return Content("Downloaded");
对于 return Redirect("www.something.com");
然后浏览器在文件下载之前被重定向。

作为序言,用户旅程是:

  • 用户在之前的 View 中填写了表单
  • 表单已提交
  • 生成并下载 XML
  • 用户被重定向/显示“已下载” View (因此按 F5 不会重新发布表单)

最佳答案

正如 Ross 所说,您只能对 HTTP 请求返回一个响应。 在这种情况下我所做的是:

  1. 向服务器发送请求
  2. 服务器生成文件并将其存储在某些服务器端数据结构中(缓存、用户 session 、临时数据)
  3. 服务器返回一个 RedirectToAction()(POST、REDIRECT、GET 模式)
  4. 重定向的操作返回一个带有一些 javascript 的 View
  5. 通过将 window.location.href 属性设置为将文件发送回浏览器的特殊下载操作来触发预生成文件的下载

关于asp.net-mvc - 下载生成的文件后重定向/显示 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27075209/

相关文章:

javascript - 我应该发送原始数据还是 Html 作为 Ajax 响应?

c# - 如何在 Razor MVC asp.net 中组合两个 View 模型

c# - ASP.NET MVC 帮助程序扩展和关注点分离

jQuery 验证、ASP.NET MVC ModelState 错误(异步 POST)

c# - MVC 5 模型绑定(bind)器覆盖

asp.net - RedisSessionStateProvider 弹性缓存死锁

asp.net-mvc - 使用 Web Api 验证 .NET MVC 应用程序

c# - ASP.NET Core 请求本地化选项

c# - MVC4 无效的日期时间值

asp.net - 您如何决定将模型数据从 asp.net mvc Controller 传递到 View 的方式?