下载后重定向

时间:2018-04-26 11:02:40

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

我是MVC的新手。我有一个索引页面。其中显示了用户的项目列表。然后,用户可以添加新项目。在用户添加新项目后,将为其下载包含敏感信息的文件。 所有这些都很好,但......

我现在的问题是如何将它们重定向回索引页面以刷新项目列表?它几乎就像下载后需要重定向一样。

注意:插入下载所有工作正常。我只想弄清楚如何在下载后重定向到另一个模型,以便我可以刷新我的列表。

我无法首先进行重定向,因为保存到文件中的数据非常敏感,因此我不想将其发送到任何地方。

[Authorize]
public async Task<IActionResult> Index(int clientId, string error)
    {
     // ....... Removed
     var model = new SecretIndexModel()
        {
            Client = clients.Client,
            ErrorMessage = error
        };
        return View(model);
    }

在此页面上,用户可以添加新项目。

[Authorize]
[HttpPost]
public async Task<IActionResult> Add(SecretIndexModel model)
{

 /// removed ....

 return DownloadDocument("results json string"); 
 }

下载

 public FileResult DownloadDocument(string id)
    {
        var ms = new MemoryStream(System.Text.Encoding.ASCII.GetBytes("abc"));

        return File(ms, System.Net.Mime.MediaTypeNames.Application.Octet, "secret.json");
    }

我是不是错了?我知道我需要添加这样的东西,因为如果我返回而不是下载,那就有用了。

return RedirectToAction("Index",
       new
          {
           clientId = model.Client.Id,
           error = (client.Errors == null)
                   ? string.Empty
                   : client?.Errors?.FirstOrDefault()?.Message
          });

更新

我可以使用TempData发送数据,但这似乎没什么用,我可以刷新索引页但不下载文件。

1 个答案:

答案 0 :(得分:1)

正如@ADyson在评论中所说,下载和重定向是两种不同的响应,您只能返回一个响应。就个人而言,我会返回重定向,然后只需包含一个下载文件的链接。您可以将链接网址保存到TempData,并将其显示为提醒或举报通知。您还可以设置元刷新标记以自动请求下载。例如,检查Visual Studio download page。它会加载一个带有链接的页面,以便在它不自动启动时下载该文件,但是在一两秒后,您会自动提示下载。

如果您真的想要更进一步,特别是如果下载需要一些时间来创建,您可以启动下载文件创建过程并立即返回重定向。然后,使用SignalR,您可以在下载实际准备好时通知用户,甚至可以在此时自动下载。如果下载需要一段时间来创建,这又提供了更理想的用户体验。他们没有让用户盯着空白页面,而是立即得到响应,并在准备好后立即下载。