我是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
发送数据,但这似乎没什么用,我可以刷新索引页但不下载文件。
答案 0 :(得分:1)
正如@ADyson在评论中所说,下载和重定向是两种不同的响应,您只能返回一个响应。就个人而言,我会返回重定向,然后只需包含一个下载文件的链接。您可以将链接网址保存到TempData
,并将其显示为提醒或举报通知。您还可以设置元刷新标记以自动请求下载。例如,检查Visual Studio download page。它会加载一个带有链接的页面,以便在它不自动启动时下载该文件,但是在一两秒后,您会自动提示下载。
如果您真的想要更进一步,特别是如果下载需要一些时间来创建,您可以启动下载文件创建过程并立即返回重定向。然后,使用SignalR,您可以在下载实际准备好时通知用户,甚至可以在此时自动下载。如果下载需要一段时间来创建,这又提供了更理想的用户体验。他们没有让用户盯着空白页面,而是立即得到响应,并在准备好后立即下载。