最近在項目中經常用到模態窗口(showModalDialog),客戶需要在一個模態窗口中有"生成Excel報表"并"導出"的功能。接到任務后,直接就開始按常規操作實現。
在按鈕的Click事件中,根據模板生成Excel報表,填充數據,保存到臨時文件夾,然后用Response.WriteFile函數輸出文件,一切看上去都很順利。代碼如下:
//根據.net數據集創建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></iframe><!--用.net的iframe模擬文件下載-->
然后重新修改<base>標簽target為框架名:
<base target="download">
[asp-net]ElMAH(ASP.NET錯誤日志記錄與通知)系列文章-基礎應用 (佚名,04-20)
> ElMAH(ASP.NET錯誤日志記錄與通知)系列文章-基礎應用篇 最近在研究幾個ASP.NET的開源項目時,發現都在使用ELMAH來作為記錄整個應用程序的錯誤日志,于是拿來小研究了一下,在這里和各位分享一下,如果有使用過的,請多指教。 ……
Body> /// <summary> /// 導出Excel方法 &nb……
Body> /// <summary> /// 獲取分頁字符串(通用) /// </summary>……
> 存儲過程的封裝 只是做一個例子,別的可以仿照下面的例子改改就好了。 代碼<!--Code highlighting produced by Actipro CodeHighlighter (freeware)……
> 開貼說說文本編輯器的那些事情-捕獲輸入內容原本應該先給大家說明一下程序框架的,不過,現在程序框架還沒有定下來,所以暫時再給大家介紹一些具體的技術。這篇隨筆告訴大家怎么獲得輸入的內容。 輸入內容,隨便Google一下的話,大概會出現以下……