2011-01-15 7 views
2

Ich habeWie MVC Datei in AsyncControl herunterladen?

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; 
    } 
} 

und natürlich, ajax Form

<% var form = Ajax.BeginForm(...) %> 
    <input type="image" src="...gif" /> // this is my 1st attempt 
    <%= Ajax.ActionLink(...) %>   // 2nd attempt 
<% form.EndForm(); %> 
  1. i versuchen erste Methode (input type = Bild). es erreicht die richtige Aktion. aber kein Dateidownload auf der Client-Seite.
  2. Dann versuche ich Ajax.ActionLink, die ich wirklich hasse. Ich möchte einen schönen Bild-Button, keinen Link-Text. Erneut erreicht er korrekte Aktion und keinen Dateidownload. Aber wenn ich Link in einem anderen Fenster öffne, gibt es Dateidownload !!

Q. Wie mit AsyncController

Q. Wie man Ajax.ActionLink lok schön

+0

zuerst dachte ich, AsyncController = AjacController. aber es ist nicht. – Bonshington

Antwort

0

ich fand einen weg !!

Erstellen Sie einfach Iframe, das regelmäßige Form hat und jquery verwenden, um zu triggern.

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

: D

ps Kredit Firebug + Google Doc.

5

Sie Ajax-Dateien vom Server herunterladen können nicht eine nette Datei downlaod machen. Der Grund dafür ist, dass, selbst wenn es Ihnen gelingt, die asynchrone Anfrage an den Server im success Callback zu stellen, Sie die Dateiinhalte vom Server erhalten erhalten und Sie können nicht viel mit dieser Datei auf der Clientseite machen. Denken Sie daran, dass JavaScript nicht auf das Dateisystem zugreifen kann, sodass Sie es nicht speichern können. Der Weg, dies zu erreichen, ist ein normales HTML <form>, das auf die Aktion Download zeigt. Wenn dieses Formular gesendet wird, wird der Benutzer gefragt, wo er die Datei speichern möchte und der Download wird fortgesetzt. Sie benötigen dazu auch keinen AsyncController.

Hier ist ein Beispiel:

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

und innerhalb Ihrer Ansicht:

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

Und um die Download-Button aussieht schön zu machen, könnten Sie ein schönesdownload.png Bild, das wird als Formular-Senden-Schaltfläche verwendet.

3

Ich benutze diese:

zu deaktivieren

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

mit 3 einreichen 1

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

für ein Formular aktivieren 2 zu aktualisieren Datei All Post an die gleichen Action zum Download aber 2 von ihnen haben param zum download als csv oder als pdf

beim Download einfach Ajax-Einreichung deaktivieren.