2014-11-20 69 views
3

我被要求看看我們的一個小型儀表板Web應用程序的網頁應該是一個簡單的問題。這個應用程序只顯示了一些基本的狀態信息,我深入研究了底層後端應用程序。問題如下:ReportViewer Web窗體導致頁面掛起

在用戶可以輸入參數並請求使用給定用戶輸入查看報表的頁面上,按鈕會調用一個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() 

我省略了一些代碼,建立了報表的參數,但我懷疑這是否有意義。

問題是,當用戶點擊顯示報告按鈕並打開這個新頁面時,根據他們使用的參數類型,報告可能需要相當長的一段時間才能渲染,同時,原始頁面變得完全沒有反應。報告頁面實際呈現的那一刻,主頁面再次開始運行。我應該從哪裏開始(谷歌關鍵字,ReportViewer屬性等),如果我想修復這種行爲,使其他頁面可以異步加載而不影響主頁面?

編輯 -

我嘗試過做後續,這在鏈接的答案在這裏評論:

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

這取代了window.open調用。這似乎工作,但當我檢查了文檔,試圖瞭解這是做什麼,我發現這一點:

.context屬性在jQuery 1.10中被棄用,只保留到支持.live所需的程度)在jQuery Migrate插件中。它可能在未來的版本中被移除,恕不另行通知。

我完全刪除了上下文屬性,它似乎並沒有影響代碼......可以用這種方式使用這個ajax調用來打開另一個窗口,還是有更好的方法?

+1

有一個解釋爲什麼window.open阻塞,以及一個方法解決它在這裏:[window.open()工作不同AJAX成功](http://stackoverflow.com/questions/) 10223388/window-open-works-different-on-ajax-success) – 2014-11-25 08:26:17

+0

@JustinRyan你能詳細說明鏈接中給出的答案嗎?我不知道如何將其應用於上述代碼。 – 2014-11-25 15:07:38

+1

[這一個可能會更清楚],並提問者似乎有相同的情況,你是(http://stackoverflow.com/questions/9793774/window-openurl-different-behavior-same-code-different-timing)在。儘管我不記得閱讀確切的原因,但是當window.open調用是由代碼創建的時候,瀏覽器會阻塞,但是不會在用戶交互時產生。所以,就你而言,調用窗口在響應之前等待報告完成。建議的解決方案似乎都涉及首先打開一個空白窗口,然後超時,最後加載您所需的URL。 (續...) – 2014-11-25 20:04:28

回答

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

使用

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

var exists = CheckSession(); 

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

} 
});` 

它會奏效。

+0

這將改變父窗口的位置。 OP想要一個新窗口。 – 2014-11-26 09:54:36

+0

<%= Url.Content(「〜/ Reports/Launch.aspx?Report = Short&Area = 1」)%> 返回什麼? – RatheeshBabu 2014-11-26 12:34:31

+0

看來,它返回的URL來檢索報告。 – 2014-11-26 20:20:31

0

這是一個遠射,但你有沒有嘗試用空白的URL先打開窗口,然後改變位置?

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