c# - ASP.Net 核心重定向到返回 FileStreamResult 的操作
问题描述
我必须在控制器中采取行动:
[Route("api/[controller]")]
[ApiController]
public class ValuesController : ControllerBase
{
[HttpGet("redirect1")]
public IActionResult Redirect1()
{
var r = RedirectToAction(nameof(GetStream));
return r;
}
[HttpGet("stream")]
public IActionResult GetStream()
{
var ms = new MemoryStream(Encoding.UTF8.GetBytes("Hello Word"));
return File(ms, "application/octet-stream", "test.xyz", true);
}
}
当我键入https://localhost:44352/api/values/redirect1
时,另存为对话框打开以供下载,但浏览器中的 url 未更改为https://localhost:44352/api/values/stream
. 也是一种更改网址的方法。如果GetStream
操作返回 json,则 url 将更改为https://localhost:44352/api/values/stream
. 如果我返回,怎么可能更改 url FileStreamResult
。
有可能在视图中有一些东西,比如“等待......”并返回FileStreamResult
解决方案
如果我返回 FileStreamResult,怎么可能更改 url?
您可以返回一个 HTML 来制作它:
公共 IActionResult Redirect1() {var r = RedirectToAction(nameof(GetStream));返回 r;var url = this.Url.Action(nameof(GetStream)); 返回内容( $"<script>history.pushState({{}},'downloading','{url}');history.go()</script>", “文本/html” ); }
关键是从 JavaScript 拼写魔法,这样您就可以随心所欲地改变浏览器的行为。
视图中可能有一些东西,比如“等待......”并返回 FileStreamResult
同样,您可以通过 HTML 内容来做到这一点。假设您要显示一条 waiting...
消息并在 1 秒内触发下载:
public IActionResult Redirect1()
{
var url = this.Url.Action(nameof(GetStream));
return Content($"<div id='msg'>waiting...</div><script>history.pushState({{}},'downloading','{url}'); setTimeout(function(){{document.getElementById('msg').textContent='';history.go();}}, 1000);</script>","text/html");
}
如果你的 javascript 变得更复杂怎么办?只需创建一个cshtml
视图并将内容放在视图文件中。
推荐阅读
- ios - UIApplicationProtectedDataWillBecomeUnavailable 通知 VS applicationProtectedDataWillBecomeUnavailable 委托
- python - Pipenv 安装运行时错误:未创建或指定位置
- python - Python:如何迁移在数据框中将 SVM 函数应用于分组依据的 R 函数
- excel - 当我从另一个宏“调用”它时宏不起作用,但当我单独选择它时它确实起作用
- kubernetes-helm - Helm 中的 {{- range .Values.xxx }} 和 {{ range .Values.xxx }} 有什么区别
- authentication - 当数据存储中没有本地用户时如何将身份验证标记为失败
- html - 我想在白色背景 div 中使按钮边框透明
- android - SharedViewModel 是否违反单一职责原则?
- java - JOOQ 中的 POJO 映射,无论参数顺序如何
- python - 使用 python 在邮件正文中发送 html