我已经创建了一个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的控制器方法。这在从视图中调用时工作正常,但从局部视图调用时失败。我的猜测是它与Controller上下文有关。任何帮助,将不胜感激。感谢。
答案 0 :(得分:1)
很抱歉没有在我的评论中更直接地回答您的问题。
通过将其置于局部视图中,您期望发生什么?基本上,对于文件,它是一个全有或全无的命题。一旦你返回一个FileResult,就会结束游戏。没有页面呈现,唯一发生的是文件被流式传输到客户端的浏览器。基本上,在HTTP流中,您只能拥有一种内容类型 - 它是HTML文档或其他类型的文件。
如果您真正想要的是拥有一个自定义标记的页面,该页面恰好在框架内显示PDF,我建议使用<iframe>
标记,然后指向的源 iFrame标记是一个返回文件的动作。
答案 1 :(得分:1)
原来问题不是局部视图,而是我使用的是Ajax.BeginForm。它试图在Ajax上下文中进行下载,这就是导致它失败的原因。改用Html.BeginForm就可以了 - 希望这有助于将来的某个人。