[問題] BinaryWrite下載檔案後 再註冊一段script

看板C_Sharp (C#)作者 (4545454554)時間1年前 (2023/04/26 11:35), 1年前編輯推噓1(102)
留言3則, 2人參與, 1年前最新討論串1/1
各位好 我用類似下面的語法下載一個檔案 接著再用 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://www.ptt.cc/bbs/C_Sharp/M.1682480124.A.B2C.html

04/26 17:34, 1年前 , 1F
最簡單就是直接設斷點或每行後印文字,看是掛在哪一行呀
04/26 17:34, 1F
謝謝 我有設中斷點觀察了 補充如上

04/26 19:21, 1年前 , 2F
Response.End()發生ThreadAbortException?
04/26 19:21, 2F
謝謝 我剛剛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);

04/29 02:43, 1年前 , 3F
Page的life cycle被CompleteRequest結束了?
04/29 02:43, 3F
不知道 但我試過把 RegisterStartupScript 放在 CompleteRequest() 的前面 也是不行 ※ 編輯: kisha024 (220.142.220.156 臺灣), 04/29/2023 14:09:37
文章代碼(AID): #1aI9lyii (C_Sharp)
文章代碼(AID): #1aI9lyii (C_Sharp)