2011-02-24 50 views
0

我正在使用.NET4 MVC3 VS2010。我們使用ABCpdf將html轉換爲pdf並將其流式傳輸到瀏覽器。問題是我需要找出一種方法來在新窗口或標籤中打開pdf。我已經閱讀了一堆關於類似問題的帖子,但是對於這個特定案例我找不到任何幫助。 單擊頁面上的按鈕(而不是鏈接)後,控制器操作會負責從該頁面的html創建內存流,然後將其轉換爲pdf並將其發送到瀏覽器。點擊一個按鈕,在新窗口中打開一個流頁面或標籤

代碼在該頁面的視圖: VAR pdfUrl =的String.Format( 「window.location.href = '{0}';」,Html.BuildUrlFromExpressionForAreas(C => c.GeneratePdf(myUrl))) ; } @(Html.Button( 「btnPdf」, 「生成PDF」,HtmlButtonType.Button,pdfUrl)))

代碼在行動myController的: 公衆的ActionResult GeneratePdf(字符串URL) 文件pdfDoc =新的文件( ); int docId; MemoryStream outputStream = new MemoryStream();

和一堆其他的pdf轉換代碼.....然後: byte [] pdfData = pdfDoc.GetData(); outputStream.Write(pdfData,0,pdfData.Length); outputStream.Write(pdfData,0,pdfData.Length); outputStream.Position = 0; 返回新的FileStreamResult(outputStream,「application/pdf」); }

它工作正常,但pdf顯示在相同的窗口/選項卡。如何將數據流式傳輸到瀏覽器中的新窗口或選項卡? 我是一個新手,並會感謝詳細的幫助。 目標屬性不適用於這種情況。我無法工作window.open到按鈕的視圖代碼,我不知道這也會做的伎倆。提前

回答

0

感謝你可以使用正常的鏈接與target="_blank"屬性:

@Html.ActionLink(
    "Generate PDF", 
    "GeneratePdf", 
    "MyController", 
    null, 
    new { 
     url = "some url", 
     target = "_blank" 
    } 
) 

,或者如果你想有一個按鈕,你可以使用JavaScript:

<input type="button" value="Generate PDF" id="btnPdf" data-pdf-url="@Url.Action("GeneratePdf", "MyController", new { url = "some url" })" /> 

,然後在一個單獨的JavaScript文件您可以使用jQuery並訂閱此按鈕的單擊事件並打開一個新窗口:

$(function() { 
    $('#btnPdf').click(function() { 
     // get the url of the data-pdf-url property of the button 
     var url = $(this).data('pdf-url'); 
     window.open(url, 'pdf'); 
     return false; 
    }); 
}); 
+0

感謝您的快速響應。我制定了類似於第二個建議的代碼,但是使用Firebug,我得到「$未定義」 – FZF 2011-03-13 23:03:57

+0

@FZF,這是jquery。它是否包含在你的頁面中? – 2011-03-13 23:04:39

+0

它包含在母版頁中。我會進一步檢查。 – FZF 2011-03-13 23:14:54

0

@Darin Dimitrov,謝謝,頁面缺少參考。我解決了這個問題,但它的表現很奇怪:第一次點擊按鈕它什麼都不做(不回到控制器中的任何動作)。第二次點擊按鈕它會打開一個新標籤,但是給出一個錯誤,他資源不可用,並顯示它正在尋找一個名爲undefined的視圖!如果我忽略這一點並返回原始頁面並第三次單擊相同的按鈕,那麼它的行爲就像我希望在第一次點擊時那樣:它會打開一個新標籤並顯示以pdf格式進行流式處理和格式化的原始頁面數據,一切正常!有什麼建議麼?我非常感謝你的幫助。這裏是我的JS代碼:

<script type="text/javascript"> 
$(document).ready(function() { 
    $("#btnPdf").click(function() { 
     var url = $(this).attr("href"); 
     $(this).attr("href", '@MvcHtmlString.Create(Html.BuildUrlFromExpressionForAreas<MyController>(c => c.GeneratePdf(Request.Url.ToString())))').bind("click", 
       function() { 
        var win = window.open(url); 
        win.focus(); 
        return false; 
       }); 
    }); 
    }); 
</script> 
+0

@Darin Dimitrov,我失去了訪問我原來的個人資料,我不得不發表我的評論像一個答案。對不起所有人,上面的答案不是真正的答案,而是第一個答案下面的評論的後續問題! – FZF 2011-03-14 18:11:52

+0

@Darin Dimitrov,當我回到原始頁面並繼續單擊時,代碼實際上表現得非常奇怪:第一次單擊時沒有任何反應,第二次單擊我得到一個帶有錯誤的新窗口,第三次單擊它會打開一個帶有錯誤和一個新窗口的新窗口用正確的PDF流到瀏覽器,第四次點擊打開一個新的勝利,錯誤和2個新的勝利,PDF輸出,第五次點擊給出一個新的錯誤勝利和3個新的勝利與PDF輸出,等等。任何建議可能會導致這種奇怪的行爲? – FZF 2011-03-15 16:37:31

相關問題