单击按钮,在新窗口或选项卡中打开流式页面

问题描述 投票:0回答:2

我使用的是.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”,“Generate PDF”,HtmlButtonType.Button,pdfUrl)))

MyController中的代码操作:public ActionResult GeneratePdf(string url)Doc pdfDoc = new Doc(); int docId; MemoryStream outputStream = new MemoryStream();

和一堆其他的pdf转换代码..... then:byte [] pdfData = pdfDoc.GetData(); outputStream.Write(pdfData,0,pdfData.Length); outputStream.Position = 0;返回新的FileStreamResult(outputStream,“application / pdf”); }

它工作正常,但pdf显示在同一窗口/选项卡中。如何将数据流式传输到浏览器中的新窗口或选项卡?我是新手,非常感谢您的详细帮助。 target属性不适用于这种情况。我无法工作window.open进入按钮的视图代码,我不确定是否也会这样做。提前致谢

javascript asp.net-mvc-3
2个回答
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并订阅此按钮的click事件并打开一个新窗口:

$(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
投票

@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> 
© www.soinside.com 2019 - 2024. All rights reserved.