在文件下载功能中的response.End()之后,ReturnToAction()似乎没有影响

时间:2018-07-19 02:01:46

标签: c# asp.net asp.net-mvc

我无法找到一种方法解决这一问题,希望有人可以提出解决方案。 问题是我有一个ASP Web应用程序(MVC)。控制器之一执行用户下载文件的操作。动作中的代码如下

public ActionResult DownloadUserData()
    {                     
        System.Web.HttpResponse response = System.Web.HttpContext.Current.Response;
        response.ClearContent();
        response.Clear();

        response.ContentType = "text/plain";
        response.AddHeader("Content-Disposition", "attachment; filename=" + myfileName + ";");
        response.TransmitFile(myfileName);
        response.Flush();
        response.End();//My guess is because response has been ended here therefore redirection below has no impact

        return RedirectToAction("ThankYouPage", "Purchases"); //This doesn't seem to work as I have an javascript in page if loaded it would show an alert          
    }

我已经尝试了许多用于重定向的变体,但似乎没有任何效果。 请指导

2 个答案:

答案 0 :(得分:0)

您不需要包括Response.End()行。重定向完成后,它将自动发生。

此外,您的操作应该只有一个操作,要么下载文件,要么重定向到另一页面。

由于在不同的请求中发生下载,因此无法知道何时在客户端通过服务器端完成下载,因此无法执行任何操作。

如果要更新页面中的某些信息,则可以使用JavaScript函数,请尝试使用Ajax,当请求完成时,它将允许您在客户端执行某些操作。

我希望它对您有用,请考虑一下并编写好代码!

答案 1 :(得分:0)

某人通常如何进行文件下载/谢谢页面?我们可以看看Microsoft自己如何下载灵感。

通常会有一个带有标记为“下载”的按钮的页面。单击该链接仅会将您带到“谢谢”页面。在第二页上,有两件事:

  1. 指向实际下载文件的显式链接(以及一条消息,提示如果下载未自动开始,则使用该文件)

  2. 一个<iframe>的{​​{1}}设置为与上面的显式链接相同的位置。

现在,当然,您要在文件完全下载之前显示“谢谢”消息,但实际上它已经足够好了。人们开始下载后会期望看到“之后”页面,即使实际上需要花费几个小时才能运行。

基于此,您应该能够自己构建非常相似的东西。