我有一个控制器操作,可以下载动态生成的文件:

    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/

10-13 07:58
查看更多