2013-01-07 22 views
5

Ich verwende Rotativa Werkzeug, um pdf anzuzeigen. Es funktioniert gut mit dem folgenden Code:Rotativa Download mit SaveAs Dialog

public ActionResult PreviewDocument() 
{ 

    var htmlContent = Session["html"].ToString(); 
    var model = new PdfInfo { Content = htmlContent, Name = "PDF Doc" }; 
    return new ViewAsPdf(model); 
} 

ich den Weg wissen, wollte die pdf via Browser „Speichern unter“ -Dialog zum Herunterladen auf einen Klick auf eine Schaltfläche und nicht in einem iframe angezeigt werden soll. "new ViewAsPdf (model)" gibt nur die PDF-Daten zurück.

Vielen Dank im Voraus.

Antwort

5

Sie zusätzliche Attribute zum rotativa Aufruf wie folgt hinzufügen:

return new PartialViewAsPdf("PreviewDocument", pdfModel) 
        { 
         PageSize = Size.A4, 
         FileName = "PDF Doc.pdf" 
        }; 

Und es wird für Sie die Datei erstellen. :)

+0

Warum ist das nicht die akzeptierte Antwort? Es ist einfach, erfordert kaum zusätzlichen Code und funktioniert gut. – Simon

3

Ich habe endlich einen Weg, dies zu tun.

Tatsächlich gibt rottivas Methode "return new ViewAsPdf (model)" HttpResponseStream zurück. Wo wir kaum etwas tun können. Aber wir können die Antwort modifizieren/ändern, sobald die Aktion mit einem benutzerdefinierten Attribut ausgeführt wird. Wir können den OnResultExecuted() -Methode des Aktionsfilters überschreiben.

Kontrolleurs Aktion

[HttpGet] 
[ActionDownload] //here a custom action filter added 
public ActionResult DownloadDocument() 
{ 
    var htmlContent = "<h1>sachin Kumar</hi>"; 

    var model = new PdfInfo {FtContent = htmlContent, FtName = "Populate Form"}; 
    return new ViewAsPdf(model); 
} 

Custom Action Filter:

public class ActionDownloadAttribute : ActionFilterAttribute 
{ 
    public override void OnResultExecuted(ResultExecutedContext filterContext) 
    { 
      //Add content-disposition header to response so that browser understand to download as an attachment. 
     filterContext.HttpContext.Response.AddHeader("content-disposition", "attachment; filename=" + "Report.pdf"); 

      base.OnResultExecuted(filterContext); 
    } 
} 
+1

Warum wird diese Antwort nicht als "Antwort" erwähnt? Dies ist nützlich für alle Benutzer, die MVC ActionResults verwenden, um PDF-Dateien unabhängig von einer Bibliothek zurückzugeben. Ich benutze MvcRazorToPdf, es hängt von iTextSharp ab, und dieser Code funktioniert immer noch. –

+0

Das ist unnötig kompliziert, schauen Sie sich die Antwort von @ derekadk an. Sie müssen lediglich das FileName-Attribut hinzufügen: return new ViewAsPdf (model) {FileName = "file.pdf"}; –

3

Sie verwenden, um neue ActionAsPdf zurückkehren können. Keine benutzerdefinierten Attribute oder etwas anderes erforderlich. Beispiel: https://github.com/webgio/Rotativa/

public ActionResult PrintPreviewDocument() 
{ 
    return new ActionAsPdf("PreviewDocument") { FileName = "PDF Doc.pdf" }; 
} 

public ActionResult PreviewDocument() 
{ 

    var htmlContent = Session["html"].ToString(); 
    var model = new PdfInfo { Content = htmlContent, Name = "PDF Doc" }; 
    return View(model); 
} 
Verwandte Themen