#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, который затем запросит загрузку файла.