Как MVC Скачать файл в AsyncControl? - PullRequest
2 голосов
/ 16 января 2011

У меня есть

public class FileController : AsyncController
{
  public ActionResult Download(FormCollection form)
  {
    FileContentResult file = new FileContentResult(Encoding.UTF8.GetBytes("10k file size"),"application/vnd.xls");
    file.FileDownloadName = "test.xls";

    return file;
  }
}

и, конечно, форма ajax

<% var form = Ajax.BeginForm(...) %>
  <input type="image" src="...gif" /> // this is my 1st attempt
  <%= Ajax.ActionLink(...) %>         // 2nd attempt
<% form.EndForm(); %>
  1. Я пытаюсь первым способом (тип ввода = изображение).это достигнет правильного действия.но нет загрузки файла на стороне клиента.
  2. Тогда я пытаюсь использовать Ajax.ActionLink, который я действительно ненавижу.Я хочу красивую кнопку изображения, а не текст ссылки.Опять же, оно достигает правильного действия и не загружает файл.Но если я открою ссылку в другом окне, загрузится файл !!

Q. Как создать красивый файл с помощью AsyncController

Q. Как сделать Ajax.ActionLink lok красивым

Ответы [ 3 ]

5 голосов
/ 16 января 2011

Вы не можете использовать Ajax для загрузки файлов с сервера. Причина этого заключается в том, что даже если вам удастся выполнить асинхронный запрос к серверу в обратном вызове success, вы получите содержимое файла, отправленное с сервера, и вы не сможете многое сделать с этим файлом на стороне клиента. Помните, что javascript не может получить доступ к файловой системе, поэтому вы не сможете его сохранить. Чтобы достичь этого, нужно иметь обычный HTML <form>, который будет указывать на действие Download. Когда эта форма отправлена, пользователю будет предложено выбрать, куда он хочет сохранить файл, и загрузка продолжится. Также вам не нужен AsyncController для этого.

Вот пример:

public class FileController : Controller
{
    [HttpPost]
    public ActionResult Download()
    {
        return File(
            Encoding.UTF8.GetBytes("10k file size"),
            "application/vnd.xls",
            "test.xls"
        );
    }
}

и внутри вашего взгляда:

<% using (Html.BeginForm("download", "file", FormMethod.Post)) { %>
    <input 
        type="image" 
        src="<%: Url.Content("~/content/images/download.png") %>" 
        value="download" 
        alt="download" 
    />
<% } %>

И чтобы кнопка загрузки выглядела nice , вы можете создать nice download.png изображение, которое будет использоваться в качестве кнопки отправки формы.

3 голосов
/ 25 октября 2011

Я использую это:

для отключения

$('form').removeAttr("data-ajax");

для включения

$('form').attr("data-ajax", "true");

для формы с 3 отправить 1, чтобы обновить 2, чтобы загрузить файл Все записи в один и тот же ActionResult, но 2 из них имеют параметр для загрузки в формате CSV или в формате PDF

при загрузке просто отключите передачу ajax.

0 голосов
/ 16 января 2011

я нашел способ !!

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

$("iframe").contents().find("form").submit();

: D

ps кредит на Firebug + Google Doc.

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