C#MVC:Chrome使用动作名称设置内联PDF标题
我有一个在新浏览器选项卡中显示PDF的操作C#MVC:Chrome使用动作名称设置内联PDF标题,c#,asp.net-mvc,google-chrome,pdf,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.ToStrin
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”
问题是,当google chrome在新的浏览器选项卡中打开PDF时,它会将控制器操作名称(打印)显示为PDF的标题。这就是我想要改变的。我附上了一张照片以供澄清
查看代码:
Action(“Print”、“Controller”、new{area=“area”})、new{@target=“\u blank”}尝试以下返回语句:
return File(reportResponse.Data.Document, MediaTypeNames.Application.Pdf, "something.pdf");
向操作方法传递文件名的参数,并确保参数名为'id' 查看代码:
Url.Action(“打印”、“控制器”、新的{id=“filename”、area=“area”})、新的{@target=“\u blank”}
我使用iframe解决了这个问题
创建一个填充标题和pdf url的操作
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");
}
}
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>
再加上科达达拉米的回答 当您从ASP.NET MVC传回PDF文件时,页面标题设置为用于到达控制器的路由配置的最后一个url部分 知道了这一点,您可以通过将参数设置为控制器路由配置的一部分来动态命名标题,例如:
routes.MapRoute(
"Print",
"print/{pdfName}",
new { controller = "Print", action = "Index", pdfName = UrlParameter.Optional }
);
然后MVC将使用这个值,因为它认为它是一个单独的页面
在url中使用它作为
“/print/这是我的pdf标题”不是“/print?pdfName=这是我的pdf标题”
作为查询字符串参数,MVC将返回调用PDF“print”
注意:
如中所述
当文本位于查询字符串“?”字符之前时,IIS对禁止字符有更严格的规则。不允许使用,*,%,&,:,\
()
这些字符中的任何一个,即使编码后也会给您一个“路径可能存在危险”'400错误
确保删除/替换这些禁止的字符
.浏览器(至少是Chrome和Firefox)从pdf文档的标题元数据设置页面标题。在我的情况下,pdf是一个与其他内容内联显示的部分页面。在MVC中,标题设置为操作的名称。在我的情况下,我只是将操作名称更改为通用名称。仍然希望找到更好的解决方案。是否有机会在没有文件的情况下实现此操作名称为
id
attribute?我有一个数字id(例如1234),firefox/chrome都会用这些数字id而不是文件名来显示pdf。虽然设置了Inline=true
,但您的代码段会下载pdf文件而不是内联显示。这会下载具有该名称的文件,而不是在浏览器中显示
routes.MapRoute(
"Print",
"print/{pdfName}",
new { controller = "Print", action = "Index", pdfName = UrlParameter.Optional }
);