2017-10-02 2 views
0

Ich habe eine Controller-Aktion, die ich aufrufen kann und es gibt eine PDF-Datei aus einem Byte-Array zurück. Das funktioniert richtig, und ich kann mein Dokument eingebettet auf der Seite mit diesem Rasierer Aktion Ansicht:MVC - PDF in Ansichtsmodell speichern und in Ansicht einbetten?

<embed src="@Url.Action("Preview_PDF", "Doc", new { file_name = @Model })" width="100%" height="100%" type="application/pdf"></embed> 

Gibt es eine Möglichkeit, die Datei von einem View-Modell einzubetten statt? zum Beispiel

<embed src="@Model.file" width="100% " height="100%" type="application/pdf"></embed> 

Ich bin mit „Return File“ von meinem Controller, der nicht etwas ist, das ich in meinem Modell Klasse gesetzt, als Datei ein statischer Typ ist, wird es mich nicht, es lassen erklären als eine Variable.

Wie könnte ich die Datei auf einer Seite aus einem Modell einbetten? Ich kann die Datei als Byte-Array speichern, aber ich weiß nicht, wie ich sie in der Ansicht rekonstruieren soll.

Antwort

2

Es ist möglich, aber Sie können inkonsistente Ergebnisse je nach Browser erhalten.

In Ihrem ersten Beispiel werden Sie eigentlich nichts einbetten. Sie geben ein <EMBED>-Tag mit dem Speicherort der PDF-Datei aus; Der Browser ist tatsächlich für das Abrufen der PDF verantwortlich (in einer separaten HTTP-Anfrage). Obwohl auf der letzten Seite ein PDF eingebettet ist, ist es nicht in die HTTP-Antwort eingebettet.

Wenn Sie etwas einbetten möchten, so dass der binäre Inhalt inline im HTML-Dokument angezeigt wird, sollten Sie diese Art von Syntax folgen:

<EMBED Src="data:application/pdf;base64,[Based64-encoded string]"> 

Also, wenn @Model.file ein Byte-Array ist die Datei enthält, die Sie, kann erreichen, was durch Sie eine neue Eigenschaft zum Modell hinzufügen, die das Markup zurückgibt, etwa so:

class MyModel 
{ 
    public string InlineMarkup 
    { 
     get 
     { 
      return String.Format("data:application/pdf;base64,{0}", Convert.ToBase64String(this.file)); 
     } 
    } 

... und in der Ansicht:

<embed src="@Model.InlineMarkup" width="100% " height="100%" type="application/pdf"> 

Beachten Sie auch, dass EMBED ein void element ist, so dass das </EMBED>-Tag nicht benötigt wird und nicht streng legal ist.

Siehe auch this question.

+0

Brilliant, danke für die ausgezeichnete Antwort. –

Verwandte Themen