C#MVC:Chrome使用操作名称设置内联PDF标题

时间:2016-01-20 02:42:35

标签: c# asp.net-mvc google-chrome pdf

我有一个动作,在新的浏览器标签中显示PDF。

    public ActionResult Print()
    {
        var cd = new ContentDisposition
        {
            FileName ="something.pdf",
            Inline = true 
        };
        Response.AppendHeader("Content-Disposition", cd.ToString());
        return File(reportResponse.Data.Document, MediaTypeNames.Application.Pdf);

    }

文件名工作正常。当我下载文件时,它的名字我想要“something.pdf”。

问题是当谷歌浏览器在新的浏览器选项卡中打开PDF时,它显示控制器操作名称(打印)作为PDF的标题。这就是我想要改变的。我附上了一张图片以供澄清。enter image description here

查看代码: Url.Action(“打印”,“控制器”,新{area =“Area”}),新{@target =“_ blank”}

5 个答案:

答案 0 :(得分:2)

对文件名的操作方法传递参数,并确保参数名称为'id'

View code: Url.Action("Print", "Controller", new { id = "filename", area = "Area" }), new { @target = "_blank" }



  public ActionResult Print(id)
{
    var cd = new ContentDisposition
    {
        FileName ="something.pdf",
        Inline = true 
    };
    Response.AppendHeader("Content-Disposition", cd.ToString());
    return File(reportResponse.Data.Document, MediaTypeNames.Application.Pdf);

}`

答案 1 :(得分:2)

添加到kodandarami的答案中,

当您从ASP.NET MVC传回PDF文件时,页面标题设置为用于到达控制器的路由配置的最后一个url部分

知道这一点后,您可以通过在控制器的路由配置中设置一个参数来动态命名标题,例如:

        routes.MapRoute(
            "Print",
            "print/{pdfName}",
            new { controller = "Print", action = "Index", pdfName = UrlParameter.Optional }
        );

然后MVC将使用此值,因为它认为它是一个单独的页面。

在网址中将其用作 “ / print / this-is-my-pdf-title” ,不是'/ print?pdfName = this-is-my-pdf-title”

作为querystring参数,MVC只会回退为调用PDF“ print”。

注意:this related question中所述,

当文本在查询字符串“?”之前时,IIS对禁止的字符有更严格的规定字符。不允许您<,>,*,%,&,:,\See MS Reference

这些字符中的任何一个,即使经过编码,也会给您一个“ 路径有潜在危险”的400错误。

确保删除/替换这些禁止的字符。

答案 2 :(得分:0)

尝试以下return语句:

return File(reportResponse.Data.Document, MediaTypeNames.Application.Pdf, "something.pdf");

答案 3 :(得分:0)

如果您使用 PdfConverter 生成pdf文档,则需要在对象中设置标题,如下所示

PdfConverter converter = new PdfConverter();
converter.PdfDocumentInfo.Title = "Your PDF File Name";

希望这有帮助!

答案 4 :(得分:0)

我通过使用iframe解决了这个问题。

创建一个填充标题和pdf网址的操作。

        public ActionResult ArticleSpecification(int ArticleID)
        {
            using (var context = new myEntities())
            {
                Article article = context.Article.FirstOrDefault(a => a.ArticleID == ArticleID);
                ViewData["Title"] = article.Code + " - " + article.Description;
                ViewData["PdfSource"] = "ArticleSpecificationPdf?ArticleID=" + article.ArticleID;
                return View("~/Views/Specification/pdfview.cshtml");
            }
        }

pdfview.cshtml:带有iframe以查看pdf和标题。

@{
    Layout = "";
}
<!DOCTYPE html>
<html>
    <head>
        <title>@ViewData["Title"]</title>
        <style>
            html, body, iframe {
                height: 100%;
                width: 100%;
                margin: 0;
                border: 0;
            }
            body {
                overflow-y: hidden;
            }
        </style>
    </head>
    <body>
        <iframe src="@ViewData["PdfSource"]"></iframe>
    </body>
</html>

返回pdf内容的动作。

        public FileResult ArticleSpecificationPdf(int ArticleID)
        {
            using (var context = new myEntities())
            {
                PdfFile file = null;
                Article article = context.Article.FirstOrDefault(a => a.ArticleID == ArticleID);
                if (article != null && article.SpecificationPdfID != null)
                    file = context.PdfFile.FirstOrDefault(a => a.PdfFileID == article.SpecificationPdfID);
                return new FilePathResult(file.path, "application/pdf");
            }
        }