这就是我最终在我的情况下所做的。
下面的控制器代码包含两个动作。第一个操作返回一个模型,我可以使用它来设置页面标题(这可能只是一个字符串,具体取决于您的用例)。第二个动作是获取文件内容。就我而言,我将文件内容存储在数据库中,因此我使用 id 来获取文档。
第二个操作还设置响应标头,以便在他们尝试下载文件时正确显示文件名。
public IActionResult PreviewDocument(int id)
{
Document document = _legislationFolderService.GetDocument(id);
if (document == null)
return NotFound($"Could not find document with id of {id}");
return View(document);
}
public IActionResult PreviewDocumentContents(int id)
{
DocumentContents documentContents = _legislationFolderService.GetDocumentContents(id);
if (documentContents == null)
return NotFound($"Could not find contents for document with id of {id}");
Response.Headers.Add("Content-Disposition", $"inline; filename={documentContents.Document.Name}.pdf");
return new FileStreamResult(new MemoryStream(documentContents.Contents), "application/pdf");
}
在下面的视图 (PreviewDocument.cshtml) 中,我使用 iframe 填充页面并链接到 PreviewDocumentContents 操作。我不希望我的主模板中包含布局,所以我将其设置为 null 并为页面设置了一个基本的 html 结构,我在 html 中设置了标题。
@model EFloorFiles.Service.Models.Document
@{
Layout = null;
ViewBag.Title = Model.Name;
}
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>@ViewData["Title"] - E-Floor Files</title>
<style type="text/css">
body, html {
width: 100%;
height: 100%;
overflow: hidden;
margin: 0;
}
iframe {
width: 100%;
height: 100%;
border: none;
}
</style>
</head>
<body>
<iframe src="@Url.Action("PreviewDocumentContents", new { id = Model.Id })"></iframe>
</body>
</html>