Javascript 单击按钮,在新窗口或选项卡中打开流式页面
我正在使用.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操作中的代码: public ActionResult GeneratePdf(字符串url) 单据pdfDoc=新单据(); int-docId; MemoryStream outputStream=新的MemoryStream() 还有一堆用于pdf转换的其他代码。。。。。然后: 字节[]pdfData=pdfDoc.GetData(); 写入(pdfData,0,pdfData.Length); outputStream.Position=0; 返回新的FileStreamResult(outputStream,“application/pdf”); } 它工作正常,但pdf显示在同一窗口/选项卡中。如何将数据流传输到浏览器中的新窗口或选项卡? 我是一个新手,希望能得到详细的帮助。 目标属性不适用于这种情况。我无法打开窗口。打开按钮的视图代码,我也不确定这是否会起作用。Javascript 单击按钮,在新窗口或选项卡中打开流式页面,javascript,asp.net-mvc-3,Javascript,Asp.net Mvc 3,我正在使用.NET4 MVC3 VS2010。我们正在使用ABCpdf将html转换为pdf,并将其传输到浏览器。问题是,我需要找到一种方法,在新窗口或选项卡中打开pdf。我已经读了很多关于类似问题的帖子,但在这个具体案例中找不到任何帮助。 单击页面上的按钮(而不是链接)后,控制器操作将负责从该页面的html创建内存流,然后将其转换为pdf并发送到浏览器 该页面视图中的代码: var pdfUrl=String.Format(“window.location.href='{0}';”,Html.
提前感谢您可以使用带有
target=“\u 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" })" />
@达林·迪米特洛夫,谢谢,这一页缺少参考资料。我修复了这个问题,但它的行为很奇怪:第一次单击按钮时,它什么也不做(不返回控制器中的任何操作)。第二次单击按钮时,它会打开一个新选项卡,但会出现一个错误,即资源不可用,并显示它正在查找一个名为“未定义”的视图!如果我忽略了这一点,并返回到原始页面,第三次单击同一按钮,那么它的行为将与我在第一次单击时希望的一样:它将打开一个新选项卡,并以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>
$(文档).ready(函数(){
$(“#btnPdf”)。单击(函数(){
var url=$(this.attr(“href”);
$(this.attr(“href”,“@MvcHtmlString.Create(Html.BuildUrlFromExpressionForAreas(c=>c.GeneratePdf(Request.Url.ToString())))))))。绑定(“单击”,
函数(){
var win=window.open(url);
win.focus();
返回false;
});
});
});
感谢您的快速回复。我编写的代码与您的第二个建议类似,但是使用Firebug,我得到“$is not defined”@FZF,这是jquery。它包含在您的页面中吗?它包含在母版页中。我将进一步检查。@FZF,是的,通常默认的ASP.NET MVC 3项目模板在\u Layout.cshtml
中包含jQuery。另外,请确保包含此脚本的.js
文件包含在jQuery之后。@Darin Dimitrov,我失去了对原始配置文件的访问权限,我不得不像回复一样发布我的评论。对不起大家,上面的答案并不是真正的答案,而是第一个答案下面评论的后续问题@Darin Dimitrov,当我返回到原始页面并继续单击时,代码实际上表现得非常奇怪:第一次单击没有发生任何事情,第二次单击我得到一个错误的新窗口,第三次单击它会打开一个错误的新窗口,还有一个正确的pdf流到浏览器,第四次单击打开一个有错误的新胜利和两个有pdf输出的新胜利,第五次单击显示一个新错误胜利和三个有pdf输出的新胜利,依此类推。有没有任何迹象表明是什么导致了这种奇怪的行为?
<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>