ASP .NET打印iFrame

时间:2017-08-24 12:55:35

标签: javascript c# asp.net

我有一个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才会生效。

我尝试过的事情:

  1. 我尝试像这样设置iframe的来源:
    ifprint.Src = "~/Pages/PrintWeightTicket.aspx?wt=" + sWeightTicket;
    那没有做任何事情。
  2. 我补充说:
    Response.Redirect("~/Pages/PrintWeightTicket.aspx?wt=" + sWeightTicket, false);
    ScriptManager.RegisterStartupScript行的正下方。如果我这样做,它就有效!但是,我的老板告诉我,我们不希望页面重定向到打印页面。我们希望页面保留在“搜索”页面,弹出打印对话框并打印重定向页面。所以我不得不对此进行评论,现在它不起作用。
  3. 我在SO的帖子中看到我可以尝试从ScriptManager.RegisterStartupScript函数调用Page_PreRender()函数。当我这样做时,我会在打开主页面时立即获得打印弹出窗口。我不希望这样。这实际上甚至不起作用,因为我需要输入重量票ID才能打印任何东西。
  4. 任何人都知道为什么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由于某种原因没有完成脚本的执行。

1 个答案:

答案 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。

谢谢。