ASP.NET Core 7/Razor:如何让控制器输出在新浏览器标签页显示?
附件预览问题:点击链接触发下载而非新标签页预览
我有一个Razor页面,上面包含一组「附件」列表,希望用户能够对这些附件进行「预览」。每个「预览」链接会调用一个控制器动作,该动作从数据库查询数据后,将附件以ASP.NET的FileStreamResult形式返回。
问题现象
点击链接时,文件会被下载,而我需要它在新浏览器标签页中显示。
Razor.cshtml代码:
<a href="@Model.ParseUrl(Model.MSServiceArea.QE042)" target="_blank" >@Model.ParseFileName(Model.MSServiceArea.QE042)</a>
动态生成的href:
https://localhost:44342/LifeCycle/Attachments/Download?ModuleName=MSServiceArea&LookupKey=abc
控制器代码:
public IActionResult OnGet(string ModuleName, string LookupKey) { string fileName, mimeType; Stream stream = Attachment.Download(ctx, null, ModuleName, LookupKey, out fileName, out mimeType); stream.Position = 0; var fileStreamResult = new FileStreamResult(stream, mimeType) { FileDownloadName = fileName }; return fileStreamResult; }
需求目标
实现以下流程:
- 用户点击Razor页面中的链接
- 从数据库读取任意MIME类型的「附件」
- 在新浏览器标签页中向用户展示该附件
疑问:我原本以为在锚点元素中添加target="_blank"就足够了,请问我遗漏了什么?
更新:部分成功但存在局限性
通过返回包裹附件的HTML,现在能在新标签页显示而非下载,但仅支持图片类型:
当前问题
如果附件是图片文件(如.png、.gif等),方案正常工作;但对于其他文件类型(如HTML、PDF等)无法正确显示,会显示「损坏的图片」图标。
原控制器(仅返回附件二进制数据):
public IActionResult OnGetDownload(string ModuleName, string LookupKey) { string fileName, mimeType; Stream stream = Attachment.Download(ctx, null, ModuleName, LookupKey, out fileName, out mimeType); stream.Position = 0; var fileStreamResult = new FileStreamResult(stream, mimeType) { FileDownloadName = fileName }; return fileStreamResult; }
新「预览」控制器(将附件包裹在静态HTML中):
public IActionResult OnGetPreview(string ModuleName, string LookupKey) { string html = "<html><body><img src=\"URL\" ></body></html>"; string url = "./Download/" + HttpContext.Request.QueryString; html = html.Replace("URL", url); return base.Content(html, "text/html"); }
结果:
- .png、.gif等图片文件:
<a ... target="_blank">可在新标签页成功显示附件 - .pdf、.html等文件:会打开新标签页,但显示「损坏的图片」图标而非附件内容
内容的提问来源于stack exchange,提问作者paulsm4
相关产品推荐
相关产品推荐

