我正在使用.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进入按钮的视图代码,我不确定是否也会这样做。 提前致谢
答案 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>