В asp.net mvc2 как открыть новое окно и скачать файл - PullRequest
2 голосов
/ 28 декабря 2010

В моем приложении ASP.NET MVC2 я хочу, чтобы в моем представлении была кнопка, которая собирает некоторые параметры из некоторых полей формы, а затем вызывает действие контроллера, которое возвращает FileResult для потоковой передачи файла (в соответствии с параметрами) в новое окно браузера.

Я в порядке, используя jquery AJAX для вызова действия контроллера, передавая параметры, но как мне открыть новое окно для потокового файла?

РЕДАКТИРОВАТЬ: я знаю, как выполнить потоковую передачу файла обратно в браузер клиента - я просто спрашиваю о том, как написать представление, чтобы собрать некоторые параметры для передачи к действию.

Например, у меня довольно сложная форма, разделенная на вкладки с помощью jquery.tabs (). На одной из вкладок пользователь может ввести сумму в долларах в текстовое поле, выбрать шаблон из выпадающего списка и нажать кнопку, чтобы сгенерировать ваучер. Итак, мне нужно собрать значения из поля суммы в долларах и выпадающего списка (и я хочу проверить их на стороне клиента), а затем вызвать действие контроллера, чтобы сгенерировать файл для потоковой передачи обратно в браузер.

Итак, мой вопрос - это в основном вопрос noob MVC - что я пишу в представлении, чтобы указать «мини-форму», которая содержит только эти два поля, затем проверить их (я думаю, что я в порядке с этим), затем передать их действия контроллера? (И я в порядке, используя ссылку и указав цель как _blank, чтобы открыть новое окно.)

Ответы [ 2 ]

3 голосов
/ 28 декабря 2010

Обычно вы не вызываете действия контроллера, возвращающие файлы с использованием AJAX, потому что вы не сможете много сделать с этим файлом при обратном вызове успеха (вы не можете сохранить файл на клиентском компьютере).Таким образом, есть две возможности: либо пользователю будет предложено диалоговое окно для выбора места, в котором он хочет сохранить файл, либо содержимое файла будет открыто в соответствии с программой, связанной по умолчанию (если она есть).Это заголовок Content-Disposition, который используется для управления этим поведением:

Control-Disposition: attachment;filename=foo.pdf

покажет пользователю диалоговое окно «Сохранить как» и останется на той же странице.Перенаправление не произойдет.

Control-Disposition: inline;filename=foo.pdf

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

Если вы хотите открыть содержимое файла в новом окне браузера, вы можете использовать target="_blank":

<a href="/someaction" target="_blank">Download</a>

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

1 голос
/ 28 декабря 2010

Если я хорошо понимаю, вы должны создать объект MemoryStream

MemoryStream m = new MemoryStream();

Заполните объект, а затем

HttpContext.Current.Response.Buffer = true;
HttpContext.Current.Response.ClearContent();
HttpContext.Current.Response.ClearHeaders();
HttpContext.Current.Response.ContentType = "application/ms-word";
HttpContext.Current.Response.AddHeader("Content-Disposition","attachment;filename=document.doc");
HttpContext.Current.Response.BinaryWrite(m.GetBuffer());
HttpContext.Current.Response.End();

Здесь список разрешенных типов mime

http://msdn.microsoft.com/en-us/library/ms775147%28VS.85%29.aspx

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