[ASP.NET]Fix使用window.showModalDialog開啟的視窗,無法透過Response.Write下載檔案問題

[ASP.NET]Fix使用window.showModelDialog開啟的視窗,無法透過Response.Write下載檔案問題

一般我們在ASP.NET上處理檔案下載時,常用的寫法如下,不管是要如下例中將Gridvie的資料轉成Excel下載,又或者是將資料組成特定格式,大多是透過Response.Write的方式來進行:


HtmlTextWriter tHW = new HtmlTextWriter(tSW);
Response.Expires = 0;
Response.Clear();
Response.Buffer = true;
Response.Charset = "utf-8";
Response.AddHeader("content-disposition", "attachment;filename=ok.xls");
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.ContentType = "application/vnd.ms-excel";
GridView1.RenderControl(tHW);
Response.Write(tSW.ToString());
Response.End();


DataTable tDt = DBAccess.getDataTable("Select * from Products");

tOutputStream.Append("<Table>");
foreach (DataRow tRow in tDt.Rows)
{
    tOutputStream.Append("<TR>");
    for (int i = 0; i < tDt.Columns.Count; i++)
    {
        tOutputStream.Append("<TD>" + tRow[i].ToString() + "</TD>");
        //if (i <= tDt.Columns.Count - 1)
        //    tOutputStream.Append(",");
    }
    tOutputStream.Append("</TR>");
}

tOutputStream.Append("</Table>");

Response.Expires = 0;
Response.Clear();
Response.Buffer = true;
Response.Charset = "utf-8";
Response.AddHeader("content-disposition", "attachment;filename=ok.xls");
Response.ContentEncoding = System.Text.Encoding.UTF8;
Response.ContentType = "application/vnd.ms-excel";
Response.Write(tOutputStream.ToString());
Response.End();

前陣子我們發現一個特別的問題,就是當我們的畫面是以window.showModalDialog被開啟,則該頁面的下載功能竟然失效了,本來以為是程式寫法問題,後來實際測試後發現真的與window.showModalDialog有關連,我嘗試寫了簡單的測試程式,我在Default.aspx這一頁面中加入上述的程式,讓它一開起來就跳出下載的視窗:

image

測試的結果是非常正常的,會得到正確的結果:

image

接著我又測試,我先透過另一支程式,透過window.showModalDialog來叫起Default2.aspx,我的程式是這樣寫的,非常簡單,頁面載入完成後叫起Default2.aspx:


    <form id="form1" runat="server">
    <div>
    </div>
    </form>
</body>

這個測試結果我們會發現一個空白的Default2.aspx被叫起來,但並沒有出現下載的視窗:

image

非常有趣的是,這個問題在IE上才會出現;在FireFox上出現的現象雖然不太正常,它會自動關閉掉Default2.aspx,但下載的視窗會跳出來;而在Chrome上則是一切正常,三種瀏覽器三種不同效果,這真是太酷了,這問題確實非常奇怪,但由於處理的時間並不長,後來就使用偷吃步的方式,將Default2.aspx放到一個iframe中,嘗試欺騙瀏覽器,這不是一個showModalDialog,所以我改成這樣寫,在Default3.aspx的iframe中放入Default2.aspx,並以showModalDialog方開啟Default3.aspx:


    <form id="form1" runat="server">
    <div>
    <iframe id="frame" src="Default2.aspx" />
    </div>
    </form>
</body>

測試的結果發現IE跟Chrome都可以正常的運作了,但FireFox出現了以下這個怪畫面,不管我按下確定或取消都是沒有效果的,本來以為是因為嵌入iframe導致FireFox的安全機制認為這個下載是有害的,所以擋掉,結果同樣的程式,我不透過showModalDialog,直接開啟卻又是正常的,怪哉...

image

大概找了一下還沒找到解決方法,今天就先玩到這邊了,原因還找不出來,雖然用其他方式都可以解的到此問題,但還是對這種狀況感到不解阿...

游舒帆 (gipi)

探索原力Co-founder,曾任TutorABC協理與鼎新電腦總監,並曾獲選兩屆微軟最有價值專家 ( MVP ),離開職場後創辦探索原力,致力於協助青少年培養面對未來的能力。認為教育與組織育才其實息息相關,都是在為未來儲備能量,2018年起成立為期一年的專題課程《職涯躍升的關鍵24堂課》,為培養台灣未來的領袖而努力。