Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Redirect / show view after generated file is dowloaded

Tags:

asp.net-mvc

I've got a controller action that downloads a dynamically generated file:

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

Just for reference:

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

This is working, and the file (myfile.xml) is downloaded.
However, the message "Downloaded" is not sent to the browser.

Similarly, if I replace return Content("Downloaded");
for return Redirect("www.something.com");
then the browser is redirected before the file downloads.

As a bit of a pre-amble, the user journey is:

  • User fills out form on previous view
  • Form is submitted
  • XML is generated and downloaded
  • User is redirected / "Downloaded" view is shown (so hitting F5 won't re-post the form)
like image 628
Alex Avatar asked Oct 25 '12 09:10

Alex


1 Answers

As Ross has said, you can only return one response to a HTTP request. What i do in that case is:

  1. Send the request to the server
  2. The server generates the file and stores it in some server side data structure (Cache, Usersession, TempData)
  3. The server returns a RedirectToAction() (POST, REDIRECT, GET pattern)
  4. The redirected action returns a View with some javascript which
  5. Triggers the download of the pregenerated file by setting window.location.href property to an special download action which sends the file back to the browser
like image 59
Jan Avatar answered Oct 09 '22 08:10

Jan