首页 > 解决方案 > 下载后重定向

问题描述

我是 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但这似乎没有多大帮助,然后我可以刷新索引页面但不下载文件。

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

解决方案


正如@ADyson 在评论中所说,下载和重定向是两个不同的响应,您只能返回一个响应。就个人而言,我会返回重定向,然后简单地包含一个下载文件的链接。您可以将链接 URL 保存到TempData并将其呈现为警报或 Toast 通知。您还可以设置元刷新标签以自动请求下载。例如,查看Visual Studio 下载页面。它会加载一个带有下载文件链接的页面,以防它不会自动启动,但在一两秒后,您会收到自动下载提示。

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


推荐阅读