MVC - 将PDF存储在视图模型中并嵌入视图中?

时间:2017-10-02 22:28:14

标签: asp.net-mvc razor

我有一个可以调用的控制器动作,它从一个字节数组中返回一个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是一个静态类型,它不会让我将它声明为变量。

我如何能够从模型中将文件嵌入到页面中?我可以将文件存储为字节数组,但我不知道如何在视图上重建它。

1 个答案:

答案 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">

另请注意,EMBEDvoid element,因此不需要</EMBED>标记,且不严格合法。

另见this question