【问题标题】:Close Browser Window after Form Post表单发布后关闭浏览器窗口
【发布时间】:2010-09-15 21:35:59
【问题描述】:

这是我的情况。

我的 ASP.NET 网络表单上有一个按钮。此按钮创建一个新的浏览器窗口,指向一个包含许多隐藏字段(动态生成)的页面。此表单在 body onload 事件上将自身提交给 SQL Reporting Services。这工作正常,报告显示在这个新窗口中。

但是,现在我仍想将表单发布到 SQL 报告服务,但我想取回一个 Excel 电子表格。所以我添加了另一个隐藏输入,名称为 rs:Format 和 Excel 值。这有效,用户可以选择下载 excel 文件。

但是他们现在被创建的额外窗口卡住了。我该如何解决这个问题?我尝试在同一个窗口中创建动态表单和 POST,但随后他们看到带有表单的(空)页面,而不是他们从中生成报告的页面。我试过关闭我创建的窗口,但我不知道在哪里放置 javascript 来执行此操作。如果我把它放在 onload 上,那么窗口会关闭而不提交表单。

有什么想法可以在这里做什么吗?

编辑:我在这里所做的并不是获得所需结果的最佳方式。我最终使用 WebRequest 从 Reporting Services 获取 excel 报告,而不是发布表单,因此我根本不需要第二个窗口。

【问题讨论】:

    标签: asp.net javascript html reporting-services


    【解决方案1】:

    不要关闭浏览器。它属于用户,即使您打开它。关闭它会让他们发疯。
    重定向到一个页面,向用户传达你已经完成了窗口。在那里,您可以提供一个(基于 JavaScript 的)链接,如果您愿意,可以更轻松地关闭浏览器,但关闭浏览器窗口通常很容易。

    【讨论】:

    • 生成该窗口只是为了将其生成的表单发布到 SSRS。理想情况下,我根本不需要这个窗口,但用户没有与之交互。
    • 还是不要关闭窗口。这样做可能会导致烦人的问题:如果用户看到弹出窗口并本能地关闭它,但在您的 window.close() 调用发生后点击,他们的点击会传递到下一个活动窗口中光标下方的任何内容.
    【解决方案2】:

    顺便说一句,如果弹出窗口不包含任何有用的输出,您可能需要做的是将表单提交到页面内的一个小 iframe 中。这样就无需关闭窗口,因为可以使框架不可见。

    【讨论】:

      【解决方案3】:

      当用户想要一个 Excel 文件时,不需要弹出另一个窗口。我假设 Excel 文件或 HTML 报告的选择是在一些 HTML 控件(如单选按钮或复选框)中完成的。因此,在做任何事情之前,请使用 javascript 检查该单选按钮/复选框的值并执行适当的操作。比如:

      function getReport(excelFormat)
      {
          if (excelFormat)
              document.form1.target = '_blank';
          else
              document.form1.target = '_self';
          document.form1.submit();
      }
      

      【讨论】:

      • 是的,这正是我想要的。但是,我需要服务器端代码来汇总我需要提交给 SSRS 的所有参数,而我目前这样做的方式是创建一个表单以发布到 SSRS。我认为这是我的方法出错的地方。
      【解决方案4】:

      如果按钮向原始页面发出 Ajax 请求并获得隐藏字段值怎么办?然后,您可以使用 javascript 在页面上构建另一个带有隐藏字段的表单并提交它 - 使用下载选项。由于该请求将返回一个 application/ms-excel 文件,因此它不应刷新当前页面,但仍应进行下载。您需要通过从客户端函数返回 false 来确保按钮单击不会导致回发。请注意,这仅适用于生成的表单的发布导致下载,而不是新的 html 页面。

      <script type="text/javascript">
         function submitReport( button ) {
            PageMethod.SubmitReport(onSuccess,onFailure,{ control: button });
         }
      
         function onSuccess(values,ctx) {
            var form = document.createElement('form');
            form.action = reporting-services.url;
            form.method = 'post';
            document.body.appendChild(form);
            .... add hidden fields to form from returned values
            form.submit();
            document.body.removeChild(form);
         }
      
         function onFailure(error,ctx) {
            ... pop up some error message....
         }
      
        </script>
      
        ...
      
        <asp:Button runat="server" id="reportButton" ClientClick="submitReport(this);return false;" Text="Report" />
      

      【讨论】:

        【解决方案5】:

        通常可以关闭您的应用创建的任何弹出窗口。

        这可以通过 window.close() 来完成(如果窗口不是由脚本创建的,则会弹出确认消息)。

        如果您想在关闭窗口之前确保下载成功,您将需要执行一些服务器端魔术 - 让您的服务器跟踪正在进行的下载,并从弹出窗口通过 AJAX 轮询它直到下载完成。

        一旦服务器告诉你它已经完成,窗口就可以关闭了。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2014-10-14
          • 1970-01-01
          • 2019-12-03
          • 2021-05-22
          • 2012-07-21
          • 2017-01-16
          • 2021-10-03
          • 1970-01-01
          相关资源
          最近更新 更多