我有一个 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 请求返回一个响应。 在这种情况下我所做的是:
- 向服务器发送请求
- 服务器生成文件并将其存储在某些服务器端数据结构中(缓存、用户 session 、临时数据)
- 服务器返回一个
RedirectToAction()
(POST、REDIRECT、GET 模式) - 重定向的操作返回一个带有一些 javascript 的 View
- 通过将
window.location.href
属性设置为将文件发送回浏览器的特殊下载操作来触发预生成文件的下载
关于asp.net-mvc - 下载生成的文件后重定向/显示 View ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27075209/