2012-09-18 61 views
0

我創建了一個PdfActionResult類,如下所示:如何從mvc部分視圖下載pdf?

public class PdfActionResult : ActionResult 
{ 
    public byte[] FileContents { get; set; } 
    public string FileName { get; set; } 


    public override void ExecuteResult(ControllerContext context) 
    { 
     var cd = new System.Net.Mime.ContentDisposition() 
        { 
         FileName = FileName, 
         Inline = false, 
        }; 

     context.HttpContext.Response.Buffer = true; 
     context.HttpContext.Response.Clear(); 
     context.HttpContext.Response.AppendHeader("Content-Disposition", cd.ToString()); 
     context.HttpContext.Response.ContentType = "application/pdf"; 
     context.HttpContext.Response.BinaryWrite(FileContents); 
    } 

} 

我有一個返回PdfActionResult控制器方法。這在從視圖內部調用時可以正常工作,但在從局部視圖調用時會失敗。我的猜測是它與Controller上下文有關。任何幫助,將不勝感激。謝謝。

+0

而不是創建自己的結果類,而是使用FileResult而不是? http://stackoverflow.com/questions/1375486/how-to-create-file-and-return-it-via-fileresult-in-asp-net-mvc –

+0

@Dave Markle - 感謝您的評論,但我試過了它不起作用 –

回答

1

對不起,在我的評論中沒有更直接地回答你的問題。

通過將其置於局部視圖中,您會發生什麼?基本上,與文件,這是一個全或無的命題。只要你返回一個FileResult,它就結束了。沒有頁面被渲染,唯一發生的是一個文件被傳輸到客戶端的瀏覽器。基本上,在HTTP流中,您只能擁有一種內容類型 - 無論是HTML文檔還是其他類型的文件。

如果你真的想要的是有這恰好顯示框內的PDF自定義標記的網頁,我建議使用一個標籤,然後指着的源這是 iframe代碼是返回一個動作文件。

+0

基本上,我在我的應用程序中有一個報告頁面。這個頁面有幾個jquery選項卡 - 每個選項卡加載一個局部視圖。 Fiddler實際上顯示下載是否使用FileResult或我的PdfActionResult。在一個視圖內部 - 在局部視圖內都不起作用。 (我也在任何標籤之外的部分視圖中嘗試過,並且它不起作用。) –

0

原來問題不是局部視圖,而是我使用Ajax.BeginForm的事實。它試圖在Ajax上下文中下載,這就是導致它失敗的原因。更改爲Html.BeginForm的訣竅 - 希望這將有助於未來的人。