1

我创建了一个 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 的控制器方法。这在视图中调用时工作正常,但从局部视图调用时会失败。我的猜测是它与控制器上下文有关。任何帮助,将不胜感激。谢谢。

4

2 回答 2

1

很抱歉没有在我的评论中更直接地回答你的问题。

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

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

于 2012-09-18T02:50:56.523 回答
1

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

于 2012-09-18T13:00:26.867 回答