ReportViewer Web窗口导致页面挂起

时间:2014-11-20 19:57:26

标签: javascript jquery asp.net vb.net reporting-services

我被要求查看一个简单的问题,我们的某个网页是一个小型仪表板网页应用程序。这个应用程序只显示我工作的底层后端应用程序的一些基本状态信息。问题如下:

在用户可以输入参数并请求查看具有给定用户输入的报告的页面上,按钮调用JS功能,该功能在浏览器中打开新页面以显示呈现的报告。代码如下所示:

$('#btnShowReport').click(function () {
    document.getElementById("Error").innerHTML = "";

    var exists = CheckSession();

    if (exists) {
        window.open('<%=Url.Content("~/Reports/Launch.aspx?Report=Short&Area=1") %>');
    }
});

随后打开的页面具有以下代码,该代码从Page_Load:

调用
    rptViewer.ProcessingMode = ProcessingMode.Remote
    rptViewer.AsyncRendering = True
    rptViewer.ServerReport.Timeout = CInt(WebConfigurationManager.AppSettings("ReportTimeout")) * 60000
    rptViewer.ServerReport.ReportServerUrl = New Uri(My.Settings.ReportURL)
    rptViewer.ServerReport.ReportPath = "/" & My.Settings.ReportPath & "/" & Request("Report")

    'Set the report to use the credentials from web.config
    rptViewer.ServerReport.ReportServerCredentials = New SQLReportCredentials(My.Settings.ReportServerUser, My.Settings.ReportServerPassword, My.Settings.ReportServerDomain)
    Dim myCredentials As New Microsoft.Reporting.WebForms.DataSourceCredentials
    myCredentials.Name = My.Settings.ReportDataSource
    myCredentials.UserId = My.Settings.DatabaseUser
    myCredentials.Password = My.Settings.DatabasePassword
    rptViewer.ServerReport.SetDataSourceCredentials(New Microsoft.Reporting.WebForms.DataSourceCredentials(0) {myCredentials})

    rptViewer.ServerReport.SetParameters(parameters)

    rptViewer.ServerReport.Refresh()

我省略了一些为报告构建参数的代码,但我怀疑这些代码是否相关。

问题是,当用户点击显示报告按钮时,这个新页面打开,根据他们使用的参数类型,报告可能需要相当长的时间来渲染,同时,原始页面变得完全没有反应。报告页面实际呈现的那一刻,主页面再次开始运作。如果我想修复此行为,以便其他页面可以异步加载而不影响主页,我应该从哪里开始(google关键字,ReportViewer属性等)?

编辑 -

我尝试执行以下操作,这是在评论中的链接答案:

            $.ajax({
                context: document.body,
                async: true,   //NOTE THIS
                success: function () { 
                    window.open(Address);
                }
            });

这取代了window.open调用。这似乎有效,但是当我查看文档时,试图理解这是做什么的,我发现了这个:

.context属性在jQuery 1.10中已弃用,仅维护到jQuery Migrate插件中支持.live()所需的程度。在将来的版本中,它可能会被删除,恕不另行通知。

我完全删除了上下文属性,它似乎根本没有影响代码......是否可以通过这种方式使用此ajax调用打开其他窗口,还是有更好的方法?

3 个答案:

答案 0 :(得分:2)

使用超时应该打开窗口而不会阻止主页

$('#btnShowReport').click(function () {
  document.getElementById("Error").innerHTML = "";

  var exists = CheckSession();

  if (exists) {
    setTimeout(function() {
      window.open('<%=Url.Content("~/Reports/Launch.aspx?Report=Short&Area=1") %>');
    }, 0);
  }
});

答案 1 :(得分:0)

这是一个很长的镜头,但您是否尝试首先使用空白网址打开窗口,然后更改位置?

$("#btnShowReport").click(function(){
    If (CheckSession()) {
        var pop = window.open ('', 'showReport');
        pop = window.open ('<%=Url.Content("~/Reports/Launch.aspx?Report=Short&Area=1") %>', 'showReport');
    }
})

答案 2 :(得分:-1)

使用

`$('#btnShowReport').click(function () {
 document.getElementById("Error").innerHTML = "";

 var exists = CheckSession();

 if (exists) {
     window.location.href='<%=Url.Content("~/Reports/Launch.aspx?Report=Short&Area=1")       %>';

 }
 });`

它会起作用。