1

这是我的情况。

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

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

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

关于在这里做什么的任何想法?

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

4

5 回答 5

4

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

于 2008-10-07T23:28:27.873 回答
2

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

于 2008-10-07T23:39:42.797 回答
1

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

function getReport(excelFormat)
{
    if (excelFormat)
        document.form1.target = '_blank';
    else
        document.form1.target = '_self';
    document.form1.submit();
}
于 2008-10-07T23:31:44.310 回答
1

如果按钮向原始页面发出 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" />
于 2008-10-08T00:21:04.493 回答
0

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

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

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

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

于 2008-10-07T23:32:08.257 回答