2011-01-15 2 views
2

У меняКак загрузить файл MVC в AsyncControl?

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. Как сделать хороший файл downlaod с AsyncController

Q. Как сделать Ajax.ActionLink лок хороший

+0

сначала я подумал AsyncController = AjacController. но это не так. – Bonshington

ответ

0

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

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

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

: D

пс кредит Firebug + Google Doc.

5

Вы не можете использовать 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" 
    /> 
<% } %> 

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

3

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

отключить

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

, чтобы включить

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

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

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

Смежные вопросы