Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

return both a file and a rendered view in an MVC3 Controller action

is it possible to both return a file for download and update a view from a controller method call?

or a workaround is needed, maybe using javascript (calling a refresh of the page after loading)?

the file download is created on the fly along the parameters set in a ViewModel (search parameters from various controls on the page).

like image 792
Alessandro Lendaro Avatar asked Nov 10 '11 14:11

Alessandro Lendaro


3 Answers

You can return the address of file using ViewModel or ViewData from your action, and use window.location.href as demonstrated in the following code at the end of your view.

Controller

public ActionResult Index()
{
    /* ... */

    ViewBag.FileName = "{FileName}";
    return View();
}

public ActionResult Download(string id) {
    /* ... */

    return File("{Path}", "{MIME type}", "{Desired file name}");
}

Markup

<script type="text/javascript">

    window.location.href = "/home/download/" + "@Ajax.JavaScriptStringEncode(@ViewBag.FileName)";

</script>
like image 77
Mehdi Golchin Avatar answered Nov 13 '22 01:11

Mehdi Golchin


While it is not possible to return a FileResult alongside a ViewResult, you could use a meta refresh on the returned view to redirect to the file once the page loads.

<meta http-equiv="refresh" content="600;url=/path/to/the/file" />
like image 21
Nathan Taylor Avatar answered Nov 13 '22 00:11

Nathan Taylor


One request can have one response who's response type is defined in the response header so the basic answer is no.
What you could look at doing is returning a view which contains javascript which will then request the file download.

like image 37
Andy Rose Avatar answered Nov 13 '22 02:11

Andy Rose