我试图在整个 .aspx 页面显示后执行操作。“action”是一个使用 Response 对象向用户发送文件的函数。
更多详细信息:
我正在尝试从侧边栏复制页面上链接的行为。IE 我在主页上有一个导出操作的链接,它工作正常——因为该页面在用户单击它之前已经显示。但是当用户在侧边栏上单击链接时,它应该将他们带回此主页,然后在文件显示后发送文件。
我做了一些研究,并认为使用 PageComplete 事件非常适合这个,所以我创建了我的事件处理程序并将调用放在我的 PageComplete 中的导出代码(从侧边栏加载时它关闭查询字符串)事件处理程序。但它的行为方式相同 - 弹出浏览器下载框,并且该页面从未在之前或之后加载。
如果有助于理解我在这里所做的是用于将列表发送给用户的代码片段。
Response.Clear();
Response.BufferOutput = true;
Response.ContentType = "application/ms-excel";
Response.AppendHeader("content-disposition", "attachment;filename=MyList.xls");
Response.Write(listManager.ExportLists(mycode));
Response.End();
我更喜欢一种使用页面事件来加载页面的方法,而不是修补这个逻辑。但是,如果有一种干净且更简单的方法来发送文件,并且它允许加载页面然后发送文件,那也很好。
除了 PageComplete 之外,我还可以使用另一个 Page 事件,还是我可能遗漏了什么?
编辑:对冗长感到抱歉。我意识到我无法改变 HTTP 请求的工作方式——我只是在寻找一种可接受的解决方案,它可以实现或多或少相同的结果。似乎要走的路是在几秒钟后强制刷新页面(从而确保在执行文件下载代码之前加载它)——所以我正在寻找一种方法来作为第一个答案建议 - 刷新下载。(也不必延迟,如果有无需等待即可刷新的方法)
为什么这段代码不起作用?
private void Page_LoadComplete(object sender, System.EventArgs e)
{
if (Request.QueryString["action"] != null)
{
if (Request.QueryString["action"] == "export")
{
Response.Redirect("MyHome.aspx?action=exportnow", false);
}
if (Request.QueryString["action"] == "exportnow")
{
ExportMasterList();
}
}
}
它应该做什么:页面加载完成后,执行 Response.Redirect,使用不同的查询字符串重新加载自身。当它再次到达Page LoadComplete 事件时,第二次将触发写出文件的函数。
它实际上做了什么:显然重复了两次同样的问题......它又回到了同样的问题,页面加载后如何执行操作,或者等到页面完全加载完成,然后触发刷新,将执行行动?没有用户单击某些东西,ASP.NET 就没有办法自己做某事吗?
如果是这种情况,那么 2 秒后的自动刷新也是可以接受的……但我不知道该怎么做。