作者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/cn.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