这是我的情况。
我的ASP.NET网络表单上有一个按钮。此按钮创建一个新的浏览器窗口,指向具有大量隐藏字段(动态生成)的页面。此表单在body onload事件上提交给SQL Reporting Services。这很好,报告显示在这个新窗口中。
但是,现在我仍想将表单发布到SQL Reporting服务,但我想找回一个excel电子表格。所以我添加另一个名为rs的隐藏输入:Excel的格式和值。这有效,用户可以选择下载excel文件。
然而,他们现在仍然处于创建的额外窗口。我该如何解决这个问题?我尝试在同一窗口中创建动态表单和POST,但随后他们会看到带有表单的(空)页面,而不是他们生成报表的页面。我试过关闭我创建的窗口,但我不知道在哪里放javascript来做到这一点。如果我把它放在onload上,那么窗口会在没有提交表单的情况下关闭。
关于该怎么做的任何想法?
编辑:我在这里做的不是获得我需要的结果的最佳方式。我最终使用WebRequest从Reporting Services获取excel报告而不是发布表单,因此我不需要第二个窗口。
答案 0 :(得分:3)
不要关闭浏览器。它属于用户,即使您打开它。关闭它会让他们发疯 执行重定向到与您完成窗口操作的用户进行通信的页面。在那里你可以提供一个(基于javascript的)链接,如果你想要关闭浏览器更容易,虽然关闭浏览器窗口通常很容易。
答案 1 :(得分:2)
顺便说一下,如果弹出窗口中没有任何有用的输出,您可能要做的是将表单提交到页面中的小iframe中。这样就不需要关闭窗口了,因为框架可以不可见。
答案 2 :(得分:1)
当用户想要Excel文件时,无需弹出另一个窗口。我假设Excel文件或HTML报告的选择是在一些HTML控件中完成的,如单选按钮或复选框。因此,在执行任何操作之前,请使用javascript检查该radiobutton / checkbox的值并执行相应的操作。类似的东西:
function getReport(excelFormat)
{
if (excelFormat)
document.form1.target = '_blank';
else
document.form1.target = '_self';
document.form1.submit();
}
答案 3 :(得分: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" />
答案 4 :(得分:0)
通常可以关闭应用创建的任何弹出窗口。
这可以通过 window.close()来完成(如果窗口不是由脚本创建的话会弹出确认。)
如果要在关闭窗口之前确保下载成功,则需要执行一些服务器端魔术 - 让服务器跟踪正在进行的下载,并通过弹出窗口中的AJAX进行轮询直到下载完成。
服务器告诉您完成后,可以关闭窗口。