最近在項(xiàng)目中經(jīng)常用到模態(tài)窗口(showModalDialog),客戶需要在一個(gè)模態(tài)窗口中有"生成Excel報(bào)表"并"導(dǎo)出"的功能。接到任務(wù)后,直接就開(kāi)始按常規(guī)操作實(shí)現(xiàn)。
在按鈕的Click事件中,根據(jù)模板生成Excel報(bào)表,填充數(shù)據(jù),保存到臨時(shí)文件夾,然后用Response.WriteFile函數(shù)輸出文件,一切看上去都很順利。代碼如下:
//根據(jù).net數(shù)據(jù)集創(chuàng)建Excel報(bào)表并返回Excel報(bào)表路徑
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));
//設(shè)置輸出文件類(lèi)型為excel文件。
Response.ContentType = "application/ms-excel";
Response.WriteFile(fileName);
Response.Flush();
Response.Close();
Response.End();
但是當(dāng)完成了代碼,開(kāi)始測(cè)試的時(shí)候,卻發(fā)現(xiàn)點(diǎn)擊"導(dǎo)出"按鈕沒(méi)有反應(yīng)。開(kāi)始的時(shí)候以為是創(chuàng)建Excel報(bào)表的代碼有問(wèn)題,但經(jīng)過(guò)調(diào)試后,證實(shí)創(chuàng)建Excel代碼沒(méi)有問(wèn)題,也成功的在臨時(shí)文件夾下生成了Excel報(bào)表,但是卻沒(méi)有"導(dǎo)出"報(bào)表(沒(méi)彈出下載文件對(duì)話框)。再看輸出文件的代碼,應(yīng)該也沒(méi)有問(wèn)題,之前一直這樣輸出都沒(méi)有問(wèn)題的。
在百思不得其解的時(shí)候,發(fā)現(xiàn)了一個(gè)關(guān)鍵點(diǎn)。就是之前輸出文件成功的面頁(yè)都是一般的網(wǎng)頁(yè)窗口,而這次的操作卻是在模態(tài)窗口中。問(wèn)題會(huì)不會(huì)出在這里呢?趕緊試驗(yàn)了一下。把模態(tài)窗口改成了一般的網(wǎng)頁(yè)窗口,果然可以輸出文件沒(méi)問(wèn)題,也成功下載了報(bào)表。
雖然問(wèn)題有點(diǎn)怪異,但找到了切入點(diǎn)和問(wèn)題的關(guān)鍵所在,解決應(yīng)該就不難了。google一下,發(fā)現(xiàn)模態(tài)窗口定義了<base target="_self">,這應(yīng)該是問(wèn)題所在。然后在頁(yè)面中重新定義了這個(gè)標(biāo)簽,改成了<base target="_blank">,問(wèn)題成功解決,文件可以正常下載了。但這時(shí)候又來(lái)了新的問(wèn)題,下載是可以了,但是卻會(huì)彈出一個(gè)新頁(yè)面,在模態(tài)窗口中下載再?gòu)棾鲰?yè)面肯定影響了用戶體驗(yàn)。有沒(méi)有方法在模態(tài)窗口中直接下載而不彈出新的頁(yè)面呢?既然target=_self的時(shí)候有問(wèn)題,target=_blank的時(shí)候又會(huì)彈出新的頁(yè)面,這讓我想到了在框架中打開(kāi)新窗口的做法。在頁(yè)面中加一個(gè)看不到的框架,然后把target設(shè)為框架名應(yīng)該可以解決。隨后在頁(yè)面中再加了一個(gè)大小為0的iframe
<iframe></iframe><!--用.net的iframe模擬文件下載-->
然后重新修改<base>標(biāo)簽target為框架名:
<base target="download">
[asp-net]ElMAH(ASP.NET錯(cuò)誤日志記錄與通知)系列文章-基礎(chǔ)應(yīng)用 (佚名,04-20)
> ElMAH(ASP.NET錯(cuò)誤日志記錄與通知)系列文章-基礎(chǔ)應(yīng)用篇 最近在研究幾個(gè)ASP.NET的開(kāi)源項(xiàng)目時(shí),發(fā)現(xiàn)都在使用ELMAH來(lái)作為記錄整個(gè)應(yīng)用程序的錯(cuò)誤日志,于是拿來(lái)小研究了一下,在這里和各位分享一下,如果有使用過(guò)的,請(qǐng)多指教。 ……
Body> /// <summary> /// 導(dǎo)出Excel方法 &nb……
Body> /// <summary> /// 獲取分頁(yè)字符串(通用) /// </summary>……
> 存儲(chǔ)過(guò)程的封裝 只是做一個(gè)例子,別的可以仿照下面的例子改改就好了。 代碼<!--Code highlighting produced by Actipro CodeHighlighter (freeware)……
> 開(kāi)貼說(shuō)說(shuō)文本編輯器的那些事情-捕獲輸入內(nèi)容原本應(yīng)該先給大家說(shuō)明一下程序框架的,不過(guò),現(xiàn)在程序框架還沒(méi)有定下來(lái),所以暫時(shí)再給大家介紹一些具體的技術(shù)。這篇隨筆告訴大家怎么獲得輸入的內(nèi)容。 輸入內(nèi)容,隨便Google一下的話,大概會(huì)出現(xiàn)以下……