Нет диалога загрузки с FileResult - PullRequest
1 голос
/ 22 марта 2010

Я возвращаю результат файла из действия, вызванного событием публикации формы. Я не могу получить диалог загрузки. Вместо этого, если я использую:

return File(Encoding.UTF8.GetBytes(reportPath), "text/plain", "Report.csv");

Я получаю путь к файлу при выполнении ajax в целевом div.

Когда я использую

return File(reportPath, "text/plain", "Report.csv");

Я получаю содержимое файла в целевом div.

Действие объявлено как

   [HttpPost]
   public virtual ActionResult ExportFilter(Model model) {
      string outputFile = CreateReport(model);
      return File(....)
   }

Форма отправляется через Ajax.BeginForm (...).

EDIT

Немного больше информации: моя форма имеет 2 кнопки отправки. Один используется для представления результата в целевом div, другой - для экспорта результата. Актон тот же, и я использую его, чтобы определить, какая кнопка вызвала событие:

        [HttpPost]
        public virtual ActionResult Run( model )
        {
            var bExecute = !string.IsNullOrEmpty(Request.Form["execute"]);
            return bExecute ? Execute(model) : Export(model);
        }

        [HttpPost]
        public virtual ActionResult Execute( model )
        {
            ....
            return PartialView("Report", model); 
        }

       [HttpPost]
       public virtual FileResult Export( model ) {
                .....
               return File(....)
       }

После некоторых ответов я попытался перенаправить на действие Get, используя:

   ....
    return RedirectToAction( MVC.Report.OfferDownload(ReportFile) );
}

    [HttpGet]
    public virtual FileResult OfferDownload(string FileName)
    {
        return File(FileName, "text/csv", "Report.csv");
    }

Однако это не помогло.

Я также пытался транслировать файл, но это тоже не помогло.

EDIT2

Определенно проблема Ajax, потому что она работает, когда я заменяю Ajax.BeginForm на Html.BeginForm. Одно из решений, которое я имею в виду, - это использование события onclick для кнопок отправки для изменения атрибутов формы.

Ответы [ 2 ]

1 голос
/ 22 марта 2010

Откройте файл, расположенный по пути, указанному на сервере, и прочитайте его содержимое. Отправьте содержимое как FileResult. Кроме того, не отправляйте форму через AJAX, если вы ожидаете загрузки. Ответ будет отправлен на код AJAX, и я не думаю, что браузер перехватит его и выдаст диалоговое окно загрузки файла. На самом деле это может быть целая проблема (в этом случае ваш второй образец может работать).

 string outputFile = CreateReport(model);
 using (var stream = new StreamReader( outputFile ))
 {
    return File( stream, "text/csv", "Report.csv" );
 }

РЕДАКТИРОВАТЬ : FWIW, я бы использовал "text / csv" или "application / csv" для файла CSV.

0 голосов
/ 01 сентября 2015

Для всех, кто столкнулся с этой проблемой: Redirect to GET внутри метода POST не будет работать.Вы можете сохранить свой Ajax POST, и в случае его успеха вы можете выполнить GET для обслуживания файла для загрузки, используя метод действия FileResult GET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...