作者kisha024 (4545454554)
看板C_Sharp
標題[問題] BinaryWrite下載檔案後 再註冊一段script
時間Wed Apr 26 11:35:22 2023
各位好
我用類似下面的語法下載一個檔案 接著再用 RegisterStartupScript 註冊一段
javascript 如下
// 這裡是下載的部分
string FileName = "XXX.xlsx";
MemoryStream ms = new MemoryStream();
// ... 這裡做一些處理 讓ms取得檔案資料
Byte[] bytes = ms.ToArray();
Response.AddHeader("Content-Disposition", "attachment; filename=\"" +
FileName + "\";");
Response.BinaryWrite(bytes);
Response.Flush();
Response.End();
// 隨後註冊一段javascript
Page.ClientScript.RegisterStartupScript(this.Page.GetType(), "AA",
"alert('BB');", true);
------------------------------------------
我發現 註冊javascript那一段 不會work
但是 如果把下載那部分的程式碼mark起來 註冊javascript那一段 是會work的
如果把javascript那一段mark起來 也是可以正常下載
想請問 要怎麼改才能讓下載和javascript那一段 都可以work?
謝謝
-----------------------------------------
後來 我設中斷點觀察
發現 Response.End(); 之後的程式碼好像都沒執行
所以 我把 Response.End(); 移到最後 像底下這樣
// 這裡是下載的部分
string FileName = "XXX.xlsx";
MemoryStream ms = new MemoryStream();
// ... 這裡做一些處理 讓ms取得檔案資料
Byte[] bytes = ms.ToArray();
Response.AddHeader("Content-Disposition", "attachment; filename=\"" +
FileName + "\";");
Response.BinaryWrite(bytes);
Response.Flush();
// 隨後註冊一段javascript
Page.ClientScript.RegisterStartupScript(this.Page.GetType(), "AA",
"alert('BB');", true);
Response.End();
---------------------------------------------------------
接著 我設中斷點觀察 所有的程式碼都順利執行 檔案也順利下載
但沒看到alert跳出視窗 不知道是什麼原因?
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 223.139.129.78 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/C_Sharp/M.1682480124.A.B2C.html
1F:→ kobe8112: 最簡單就是直接設斷點或每行後印文字,看是掛在哪一行呀 04/26 17:34
謝謝 我有設中斷點觀察了 補充如上
2F:→ poewar: Response.End()發生ThreadAbortException? 04/26 19:21
謝謝 我剛剛google 好像就是這個問題
https://blog.darkthread.net/blog/response-end-alternative/
我照上面連結改用CompleteRequest
但我怎麼試 還是無法在CompleteRequest的後面註冊一段javascript
我是改成像下面這樣
//將Buffer中的內容送出
HttpContext.Current.Response.Flush();
//忽視之後透過Response.Write輸出的內容
HttpContext.Current.Response.SuppressContent = true; // 這裡改成false也不行
//忽略之後ASP.NET Pipeline的處理步驟,直接跳關到EndRequest
HttpContext.Current.ApplicationInstance.CompleteRequest();
// 隨後註冊一段javascript
Page.ClientScript.RegisterStartupScript(this.Page.GetType(), "AA",
"alert('BB');", true);
3F:推 poewar: Page的life cycle被CompleteRequest結束了? 04/29 02:43
不知道
但我試過把 RegisterStartupScript 放在 CompleteRequest() 的前面 也是不行
※ 編輯: kisha024 (220.142.220.156 臺灣), 04/29/2023 14:09:37