我有一个ASP .Net应用程序,可以在单击按钮时打印。该应用程序使用iFrame进行打印。
这是我的标记:
<iframe id="ifPrint" clientidmode="static" runat="server" style="width:100%;height:1px;" />
这是我调用的Javascript函数来打印报告:
function PrintReport() {
window.frames["ifPrint"].focus();
window.frames["ifPrint"].print();
}
该按钮位于名为Search.aspx
的页面中。这是单击打印按钮时发生的情况:
ifPrint.Attributes["src"] = "~/Pages/PrintWeightTicket.aspx?wt=" + sWeightTicket;
ScriptManager.RegisterStartupScript(this, this.GetType(), "PrintWeight", "PrintReport();", true);
正如您所看到的,该按钮应该将源设置为PrintWeightTicket.aspx
页面并打印该页面的内容。但出于某种原因,当我点击打印时,它会打印当前页面。我在我的C#代码中放了一个断点并检查ifPrint.Src
的值,并将其正确设置到PrintWeightTicket
页面。但由于某些原因,当调用Javascript中的函数时,src才会生效。
我尝试过的事情:
ifprint.Src = "~/Pages/PrintWeightTicket.aspx?wt=" + sWeightTicket;
Response.Redirect("~/Pages/PrintWeightTicket.aspx?wt=" + sWeightTicket, false);
ScriptManager.RegisterStartupScript
行的正下方。如果我这样做,它就有效!但是,我的老板告诉我,我们不希望页面重定向到打印页面。我们希望页面保留在“搜索”页面,弹出打印对话框并打印重定向页面。所以我不得不对此进行评论,现在它不起作用。ScriptManager.RegisterStartupScript
函数调用Page_PreRender()
函数。当我这样做时,我会在打开主页面时立即获得打印弹出窗口。我不希望这样。这实际上甚至不起作用,因为我需要输入重量票ID才能打印任何东西。 任何人都知道为什么iFrame
的src没有设置?
谢谢。
P.S .:
标记中的ClientIDMode = "Static"
行需要保留原因。如果有人认为这就是为什么这不起作用的原因,我会考虑解决这个问题。
编辑1:
经过一些测试后,我发现我当前的代码在Chrome中完美运行。但它在IE中不起作用。
编辑2:
我的Javascript文件名为JS_Scripts.js
。我有一个AJS.JS
和一个AJS_fx.JS
。当我打开开发人员工具并运行HTTP Watch(网络选项卡下的绿色播放按钮,不确定它是否是它的名称)时,我注意到我的所有三个javascript文件和一个WebResource.axd?.....
文件都得到了结果(Aborted)
。尽管如此,它在Chrome中的结果为200
。 IE由于某种原因没有完成脚本的执行。
答案 0 :(得分:0)
经过一个多星期的敲击键盘关于此事,我屈服了,然后去找我的老板(他太聪明了,我有时候认为他是Jon Skeet并在这里使用假身份)。
对于遇到此问题的任何人:
这就是发生这种情况的原因:
ifPrint.Attributes["src"] = "~/Pages/PrintWeightTicket.aspx?wt=" + sWeightTicket;
此行正确设置iFrame的source属性。我让iFrame可见,并看到iFrame实际上加载了源中提到的链接。
但是,下一行就是这个问题发生的原因。
ScriptManager.RegisterStartupScript(this, this.GetType(), "PrintWeight", "PrintReport();", true);
此行在Javascript中调用名为PrintReport()
的函数。此功能执行ifPrint.Focus()
和ifPrint.Print()
。但问题是,当调用这两行时,iFrame没有加载。因此,iFrame中无需打印任何内容。因此,iFrame继续打印它所在的页面。
以下是修复方法:
不使用ScriptManager.RegisterStartupScript()
来调用PrintReport()
函数,而是使用以下命令:
ifPrint.Attributs("onLoad") = "PrintReport()";
这将确保ifPrint.Print()
函数实际打印iFrame。
谢谢。