【问题标题】:How to download a pdf from a mvc partial view?如何从 mvc 部分视图下载 pdf?
【发布时间】:2012-09-18 00:55:59
【问题描述】:

我创建了一个 PdfActionResult 类,如下所示:

public class PdfActionResult : ActionResult
{
    public byte[] FileContents { get; set; }
    public string FileName { get; set; }


    public override void ExecuteResult(ControllerContext context)
    {
        var cd = new System.Net.Mime.ContentDisposition()
                     {
                        FileName = FileName,
                        Inline = false,
                     };

        context.HttpContext.Response.Buffer = true;
        context.HttpContext.Response.Clear();
        context.HttpContext.Response.AppendHeader("Content-Disposition", cd.ToString());
        context.HttpContext.Response.ContentType = "application/pdf";
        context.HttpContext.Response.BinaryWrite(FileContents);
    }

}

我有一个返回 PdfActionResult 的控制器方法。当从视图中调用时,这可以正常工作,但从局部视图中调用时会失败。我的猜测是它与控制器上下文有关。任何帮助,将不胜感激。谢谢。

【问题讨论】:

标签: c# asp.net asp.net-mvc-3


【解决方案1】:

很抱歉没有在我的 cmets 中更直接地回答您的问题。

通过局部视图,您期望会发生什么?基本上,对于文件,这是一个全有或全无的命题。一旦你返回一个 FileResult,游戏就结束了。没有呈现页面,唯一发生的事情是文件被流式传输到客户端的浏览器。基本上,在 HTTP 流中,您只能拥有一种内容类型——要么是 HTML 文档,要么是另一种类型的文件。

如果您真正想要的是有一个带有自定义标记的页面,该页面恰好在框架内显示 PDF,我建议使用 <iframe> 标签,然后指向 iFrame 标签的来源成为一个返回文件的动作。

【讨论】:

  • 基本上,我的应用中有一个报告页面。此页面有几个 jquery 选项卡 - 每个选项卡加载一个局部视图。无论我使用 FileResult 还是 PdfActionResult,Fiddler 实际上都会显示下载。在视图内部都可以工作 - 在局部视图内部都不能工作。 (我也在任何选项卡之外的部分视图中尝试过,但它不起作用。)
【解决方案2】:

原来问题不在于部分视图,而是我使用的是 Ajax.BeginForm。它试图在 Ajax 上下文中下载,这就是导致它失败的原因。更改为 Html.BeginForm 成功了 - 希望这对将来的人有所帮助。

【讨论】:

    猜你喜欢
    • 2017-12-13
    • 2020-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2017-06-14
    相关资源
    最近更新 更多