2008-12-17 77 views
2

在我的代碼中,我使用JavaScript在ASPX頁面上觸發window.open()事件。 I'm在Page_Load()事件此頁的輸出文件:將文件寫入響應後關閉彈出窗口

Response.Clear(); 
Response.ClearContent(); 
Response.ClearHeaders(); 
Response.Charset = ""; 
Response.ContentType = "application/octet-stream"; 
Response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\";"); 
outputStream.WriteTo(Response.OutputStream); 
outputStream.Flush(); 
outputStream.Close(); 
Response.Flush(); 
Response.Close(); 

後來我想關閉這個彈出窗口。但是因爲我改變了我的回覆類型,所以我無法在JavaScript中執行window.close()。它只會附加到提供給用戶的文件中。這個線程是最合適的來源,我發現解決我的問題:

Closing window after export to excel

但給出的答案不幫我,所以我基本上卡住。我不想告訴用戶手動關閉窗口。你知道如何實現我的目標嗎?

回答

0

Daniel,

您可以從AJAX頁面上傳文件。你需要做的是在後面的代碼中添加控件的ID到Update Panel Post back觸發器,這需要回發。如果控件位於同一頁面上,則不會有任何問題。但是,如果您使用具有按鈕或另一個需要回發的webcontrol的用戶控件,則必須通過USer控件的公共屬性公開此控件的標識,並讓包含頁面檢索此標識並將其添加爲回發扳機。

請讓我知道你是否需要這方面的幫助。

感謝, PRASHANT Kumbhat

+0

這會很好,但我沒有使用標準的asp.net UpdatePanel。 – Daniel 2009-03-19 10:41:22

0

一個選擇,我在過去使用的是生火的下載請求到一個隱藏的iframe,而不是彈出窗口,通過一些JavaScript:

var Utils = Utils || {}; 
Utils.download = function(url) { 
    var iframe = $("<iframe/>").hide().appendTo("body").load(function() { 
     iframe.remove(); 
    }).attr("src", url); 
}; 

這樣你就不用擔心任何可見的彈出窗口。唯一的缺點是,如果文件下載失敗,用戶根本不知道出了什麼問題(而在你的情況下,他們仍然會彈出一個窗口,並顯示錯誤信息)。要解決此問題,請不要返回文件,而要返回包含某些JavaScript的頁面,該頁面會在加載時觸發某種類型的警報,以通知用戶錯誤。

另請注意,從內存中調用加載iframe的函數並不適用於所有(任何?)瀏覽器,但在一天結束時它並不重要,因爲最壞的情況是隻是結束了一堆附在dom末尾的空iframe,這不應該引起任何問題(並且如果這是一個問題,您可以始終保持重用同一個iframe,而不是創建新的iframe)。

0

Daniel,

您錯過了這一點。要關閉彈出窗口,您必須使用腳本管理器來執行此操作,因爲您正在從UpdatePanel中觸發Upload。因此,註冊這樣的腳本:

ScriptManager.RegisterStartupScript(UpdatePanelObject, UpdatePanelObject.GetType(), "scripname","your script here", true); 

希望其幫助你!

0

我會建議你通過一個簡單的

<a href="/path/to/your/page.aspx" target="_blank">Download</a> 

這將調用你的網頁在不同的窗口發射的文件下載,下載將開始和頁面應該自動關閉。