我有一个控制器操作,可以下载动态生成的文件:
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");
然后在下载文件之前重定向浏览器。
作为序言,用户旅程是:
用户在上一个视图中填写表格
表格已提交
生成并下载XML
用户被重定向/显示“已下载”视图(因此按F5不会重新发布该表单)
最佳答案
每个HTTP请求只能有一个响应-您正试图潜入两个响应(文件和页面)。
通常,当您发送“ Content-Disposition:附件” HTTP标头时,浏览器将停留在当前页面上并弹出一个文件保存对话框(或自动将文件保存在您的下载文件中)。
如果要防止重新提交表单,则必须更改策略。我建议使用一些JavaScript禁用表单的“提交”按钮,并在div覆盖中显示“已完成”消息?
关于asp.net-mvc - 下载生成的文件后重定向/显示 View ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/13065697/