ASP.NET 2.0 PageComplete事件故障和文件下载

时间:2009-03-31 15:44:30

标签: asp.net download page-lifecycle

我试图在整个.aspx页面显示后发生一个动作。 “action”是一个使用Response对象向用户发送文件的函数。

更详细的信息:
我试图从侧边栏复制页面上链接的行为。 I.E.我在导出操作的主页面上有一个链接,它工作正常 - 因为页面已经显示在用户单击它之前。但是当用户在侧边栏上时,单击该链接,它应该将它们带回到该主页面,然后在显示后发送该文件。

我做了一些研究,并认为使用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秒后自动刷新也是可以接受的......但我不知道该怎么做。

1 个答案:

答案 0 :(得分:2)

服务器只能向用户返回一个对象,文件下载或页面。您可以管理的最好方法是将用户返回到刷新文件下载的页面。