我有一个可以调用的控制器动作,它从一个字节数组中返回一个pdf文件。这工作正常,我可以通过这个剃刀动作查看我在页面上嵌入的文档:
<embed src="@Url.Action("Preview_PDF", "Doc", new { file_name = @Model })" width="100%" height="100%" type="application/pdf"></embed>
有没有办法从视图模型中嵌入文件?例如
<embed src="@Model.file" width="100% " height="100%" type="application/pdf"></embed>
我正在使用我的控制器中的“return File”,这不是我可以设置到我的模型类中的东西,因为File是一个静态类型,它不会让我将它声明为变量。
我如何能够从模型中将文件嵌入到页面中?我可以将文件存储为字节数组,但我不知道如何在视图上重建它。
答案 0 :(得分:4)
这是可能的,但根据浏览器的不同,您可能会得到不一致的结果。
在您的第一个示例中,您实际上并未嵌入任何内容。您正在发布包含PDF位置的<EMBED>
标记;浏览器实际上负责检索PDF(在单独的HTTP请求中)。因此,虽然最终页面上嵌入了PDF,但它并未嵌入到HTTP响应中。
如果您想嵌入某些内容以便二进制内容在HTML文档中显示为内嵌,那么您可以遵循以下语法:
<EMBED Src="data:application/pdf;base64,[Based64-encoded string]">
因此,如果@Model.file
是包含该文件的字节数组,则可以通过向返回标记的模型添加新属性来完成所需的操作,如下所示:
class MyModel
{
public string InlineMarkup
{
get
{
return String.Format("data:application/pdf;base64,{0}", Convert.ToBase64String(this.file));
}
}
...并在您看来:
<embed src="@Model.InlineMarkup" width="100% " height="100%" type="application/pdf">
另请注意,EMBED
为void element,因此不需要</EMBED>
标记,且不严格合法。