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

时间:2011-02-24 20:42:48

标签: javascript asp.net-mvc-3

我正在使用.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转换代码.....然后:             byte [] pdfData = pdfDoc.GetData();             outputStream.Write(pdfData,0,pdfData.Length);             outputStream.Position = 0;             返回新的FileStreamResult(outputStream,“application / pdf”);         }

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

2 个答案:

答案 0 :(得分: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;
    });
});

答案 1 :(得分: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>