用iframe解決模態窗口文件下載問題


最近在項目中經常用到模態窗口(showModalDialog),需要在一個模態窗口中有"生成Excel報表"並"導出"的功能。直接就開始按常規操作實現。
    在按鈕的Click事件中,根據模板生成Excel報表,填充數據,保存到臨時文件夾,然后用Response.WriteFile函數輸出文件,一切看上去都很順利。代碼如下:

            //根據數據集創建Excel報表並返回Excel報表路徑
            string fileName = CreateExcel(ds);
            Response.Clear();
            Response.Charset = "utf-8";
            Response.Buffer = true;
            this.EnableViewState = false;
            Response.ContentEncoding = System.Text.Encoding.UTF8;
            Response.AppendHeader("Content-Disposition", "attachment;filename=" + HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8));
            //設置輸出文件類型為excel文件。 
            Response.ContentType = "application/ms-excel";
            Response.WriteFile(fileName);
            Response.Flush();
            Response.Close();
            Response.End();

    但是當完成了代碼,開始測試的時候,卻發現點擊"導出"按鈕沒有反應。開始的時候以為是創建Excel報表的代碼有問題,但經過調試后,證實創建Excel代碼沒有問題,也成功的在臨時文件夾下生成了Excel報表,但是卻沒有"導出"報表(沒彈出下載文件對話框)。再看輸出文件的代碼,應該也沒有問題,之前一直這樣輸出都沒有問題的。
    在百思不得其解的時候,發現了一個關鍵點。就是之前輸出文件成功的面頁都是一般的網頁窗口,而這次的操作卻是在模態窗口中。問題會不會出在這里呢?趕緊試驗了一下。把模態窗口改成了一般的網頁窗口,果然可以輸出文件沒問題,也成功下載了報表。
    雖然問題有點怪異,但找到了切入點和問題的關鍵所在,解決應該就不難了。google一下,發現模態窗口定義了<base target="_self">,這應該是問題所在。然后在頁面中重新定義了這個標簽,改成了<base target="_blank">,問題成功解決,文件可以正常下載了。但這時候又來了新的問題,下載是可以了,但是卻會彈出一個新頁面,在模態窗口中下載再彈出頁面肯定影響了用戶體驗。有沒有方法在模態窗口中直接下載而不彈出新的頁面呢?既然target=_self的時候有問題,target=_blank的時候又會彈出新的頁面,這讓我想到了在框架中打開新窗口的做法。在頁面中加一個看不到的框架,然后把target設為框架名應該可以解決。隨后在頁面中再加了一個大小為0的iframe

<iframe id="download" name="download" height="0px" width="0px"></iframe><!--用iframe模擬文件下載-->
然后重新修改<base>標簽target為框架名:

<base target="download">
重新生成,瀏覽,測試。問題成功解決。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM