我被要求看看我們的一個小型儀表板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調用來打開另一個窗口,還是有更好的方法?
有一個解釋爲什麼window.open阻塞,以及一個方法解決它在這裏:[window.open()工作不同AJAX成功](http://stackoverflow.com/questions/) 10223388/window-open-works-different-on-ajax-success) – 2014-11-25 08:26:17
@JustinRyan你能詳細說明鏈接中給出的答案嗎?我不知道如何將其應用於上述代碼。 – 2014-11-25 15:07:38
[這一個可能會更清楚],並提問者似乎有相同的情況,你是(http://stackoverflow.com/questions/9793774/window-openurl-different-behavior-same-code-different-timing)在。儘管我不記得閱讀確切的原因,但是當window.open調用是由代碼創建的時候,瀏覽器會阻塞,但是不會在用戶交互時產生。所以,就你而言,調用窗口在響應之前等待報告完成。建議的解決方案似乎都涉及首先打開一個空白窗口,然後超時,最後加載您所需的URL。 (續...) – 2014-11-25 20:04:28