c# - 下载后重定向
问题描述
我是 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
但这似乎没有多大帮助,然后我可以刷新索引页面但不下载文件。
解决方案
正如@ADyson 在评论中所说,下载和重定向是两个不同的响应,您只能返回一个响应。就个人而言,我会返回重定向,然后简单地包含一个下载文件的链接。您可以将链接 URL 保存到TempData
并将其呈现为警报或 Toast 通知。您还可以设置元刷新标签以自动请求下载。例如,查看Visual Studio 下载页面。它会加载一个带有下载文件链接的页面,以防它不会自动启动,但在一两秒后,您会收到自动下载提示。
如果你真的想更进一步,特别是如果下载需要一些时间来创建,你可以开始下载文件创建过程并立即返回重定向。然后,使用 SignalR,您可以在下载实际准备好时通知用户,甚至可以在此时自动下载。如果下载需要一些时间来创建,这再次提供了更理想的用户体验。他们没有让用户盯着空白页面,而是立即得到响应,并在准备好时下载。
推荐阅读
- firebase - 创建用户后 Flutter Firebase 身份验证应用程序崩溃
- javascript - 如何在调整大小时动态地将按钮内的文本居中?
- c# - 在 POST 方法中从 ViewModel 中检索数据
- python - 如何使用 Selenium 和 Python 在 https://www.shopdisney.com/ 中找到 Create an Account 元素
- python - 无法使用 BeautifulSoup 抓取 div 类
- python - 如何使用 tkinter 标签使此功能按顺序工作
- java - 字节 [] 到 jpg 图像?
- detours - 为什么通过原始指针调用迂回函数有效?
- sql - 使用 SQL 根据多个条件计算单个表中的行数
- python - BeautifulSoup4 - 搜索特定的 h3 字符串并存储它们