возвращает как файл, так и отображаемый вид в действии контроллера MVC3

#asp.net-mvc-3 #download

#asp.net-mvc-3 #Скачать

Вопрос:

возможно ли одновременно вернуть файл для загрузки и обновить представление с помощью вызова метода контроллера?

или требуется обходной путь, возможно, с использованием javascript (вызывающий обновление страницы после загрузки)?

загрузка файла создается «на лету» в соответствии с параметрами, установленными в ViewModel (параметры поиска из различных элементов управления на странице).

Комментарии:

1. Нет, вам придется найти другой способ.

Ответ №1:

Вы можете вернуть адрес файла с помощью ViewModel или ViewData из своего действия и использовать window.location.href , как показано в следующем коде в конце вашего представления.

Контроллер

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

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

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

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

Разметка

 <script type="text/javascript">

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

</script>
  

Комментарии:

1. что, если мой файл хранится не физически, а в виде потока, содержимое которого зависит от серии элементов управления формой?

2. @AlessandroLendaro FileResult имеет перегрузку для вас, которая получает stream вместо path. Кроме того, вы можете отправлять свои значения с клиента на сервер через строку запроса или параметр маршрута.

Ответ №2:

Хотя невозможно вернуть FileResult вместе с ViewResult, вы могли бы использовать мета-обновление возвращенного вида для перенаправления на файл после загрузки страницы.

 <meta http-equiv="refresh" content="600;url=/path/to/the/file" />
  

Ответ №3:

На один запрос может быть получен один ответ, тип ответа которого определен в заголовке ответа, поэтому основной ответ — нет.
Что вы могли бы сделать, так это вернуть вид, содержащий javascript, который затем запросит загрузку файла.