【问题标题】:Open a popup containing ASPX postback result打开一个包含 ASPX 回发结果的弹出窗口
【发布时间】:2014-03-16 11:12:18
【问题描述】:

我有一个 ASPX 页面,其中包含许多字段,当我单击“导出为 PDF”按钮时会生成 PDF 文档。

我现在想在 JavaScript 中有一个“打印 PDF”按钮,它可以执行以下操作:

w = window.open(?);
w.print();
w.close();

"?" 将执行与我的“导出为 PDF”按钮相同的回发。

【问题讨论】:

  • 生成 PDF。 CrystalExport...ExportToHttpResponse

标签: javascript asp.net pdf-generation


【解决方案1】:

在你的问题标签中有 asp.net 标签,所以我猜你可以使用某种 ASP.NET 服务器技术。

我建议这样做:

  1. 创建HttpHandler 或返回FileContentResult 的 ASP.NET MVC 操作
  2. 在你的页面中,使用此代码下载并打印文件(实际找到了here,贴上来供以后参考!)

    点击这里下载打印版

写服务器端有一些不错的教程:

【讨论】:

  • 它没有回答“回发”问题。但感谢您的努力。
  • @Serge:嗯,确实如此。从 ASPX 中删除它时,将其移动到 HttpHandler 将阻止任何回发。
  • @Serge:我很乐意帮助你。告诉我您目前的问题,我会尽力提供帮助。
  • 要使用 javascript 打印 PDF,显然需要嵌入它。要获得正确的 PDF,需要将表单的数据发布到服务器。所以我需要一种方法 1) 向服务器发送完整请求 2) 将结果放入嵌入元素中 3) 打印它
【解决方案2】:

使用 IFrame 打开 pdf 窗口,您可以这样做:

父框架内容

<script>
window.onload=function() {
  window.frames["pdf"].focus();
  window.frames["pdf"].print();
}
</script>
<iframe name="pdf" src="url/to/pdf/generation"></iframe>

灵感来自https://stackoverflow.com/a/9616706

【讨论】:

  • 如何获得“url/to/pdf/generation”?它需要由 aspx 页面的表单(回发)发送的数据。
【解决方案3】:

如果您需要将表单提交(回发)到新窗口,您可以尝试将表单目标更改为假,例如:

var form = $("form");
form.attr("target", "__foo");

提交表单。

form.submit();

并删除目标(setitmeout(,1) - 将事件放在 js“事件队列”的末尾,在我们的例子中 - 在表单提交之后):

setTimeout(function () { form.removeAttr("target");  }, 1);

另外,在提交之前,您可以尝试使用 __foo id 打开窗口以获得更多样式,并且表单将在此窗口中提交(回发)而不是新窗口:

 var wnd = window.open('', '__foo', 'width=450,height=300,status=yes,resizable=yes,scrollbars=yes');

但我不知道如何处理提交的窗口并捕获 onload 或 jquery 的就绪事件。如果你能做到,请分享解决方法并调用 wnd.print();您可以在这个 wnd 中使用 iframe,也许您会找到解决方案。

更新:

尝试看看这个原型 [在 Chrome 中测试]:

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
    <script type="text/javascript" src="https://code.jquery.com/jquery-2.1.0.min.js"></script>
    <script type="text/javascript">
        function PrintResult() {
            var wnd, checker, debug;

            debug = true;

            // create popup window
            wnd = window.open('about:blank', '__foo', 'width=700,height=500,status=yes,resizable=yes,scrollbars=yes');

            // create "watermark" __loading.
            wnd.document.write("<h1 id='__loading'>Loading...</h1>");

            // submit form to popup window
            $("form").attr("target", "__foo");
            setTimeout(function() { $("form").removeAttr("target"); }, 1);

            if (debug)
            {
                $("#log").remove();
                $("body").append($("<div id='log'/>"));
            }

            // check for watermark
            checker =
                setInterval(function () {
                    if (debug) $("#log").append('. ');

                    try {
                        
                        if (wnd.closed) { clearInterval(checker); return; }

                        // if watermark is gone
                        if (wnd.document == undefined || wnd.document.getElementById("__loading") == undefined) {
                            if (debug) $("#log").append(' printing.');
                            //stop checker
                            clearInterval(checker);

                            // print the document
                            setTimeout(function() {
                                wnd.print();
                                wnd.close();
                            }, 100);
                        }
                    } catch (e) {
                        // ooops...
                        clearInterval(checker);
                        if (debug) $("#log").append(e);
                    }
                }, 10);
        }
    </script>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Button runat="server" ID="ReportButton" OnClick="ReportRenderClick" Text="Export to PDF" OnClientClick="PrintResult()"/>
        <asp:Button runat="server" Text="Just a button."/>
    </div>
    </form>
</body>
</html>

这里是 .cs 文件:

public partial class Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {

    }

    protected void ReportRenderClick(object sender, EventArgs e)
    {
        Response.Clear();
        Thread.Sleep(2000);
        Response.ContentType = "application/pdf";
        Response.WriteFile("d:\\1.pdf");

        //Response.ContentType = "image/jpeg";
        //Response.WriteFile("d:\\1.jpg");

        //Response.Write("Hello!");
        Response.End();
    }
}

【讨论】:

  • 我接近那个解决方案,但遗憾的是,需要将 PDF 嵌入到 html 正文中才能通过 javascript 打印。所以说到底,我还是需要能够有一个相当于回发的 url。
  • 您打算支持哪种浏览器?
  • 通常的、Chrome、FireFox 等
  • 我添加了例子,也许这个原型对你有帮助。我在最新的 Chrome 中对其进行了测试,并且可以正常工作。但不确定FF等。
  • 我不得不再次阅读我的问题才能看到您的答案是否正确。然而我的问题没有解决,因为我需要一个执行回发的“url”。但是当我写这个问题时,我并不确定。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-16
相关资源
最近更新 更多