Maison > Article > développement back-end > ASP.NET MVC prévisualise directement les fichiers PDF
Contexte et exigences
Le projet utilise le framework MVC4. L'une des fonctions consiste à générer des fichiers PDF en fonction des paramètres et à les prévisualiser directement lorsque vous cliquez dessus.
Processus de mise en œuvre
1. Code de mise en œuvre de la première version :
Contenu HTML
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <p> @Html.ActionLink("预览PDF","GetPdf",null,new { target="_blank"}) </p> </body> </html>
Code du contrôleur
public ActionResult GetPdf() { return new FilePathResult("~/content/The Garbage Collection Handbook.pdf", "application/pdf"); }
Inconvénients : Le titre et le nom du fichier lors du téléchargement ne sont pas très conviviaux.
1. Code d'implémentation de la deuxième version :
Nous avons fait 2 choses :
1. Laissez la boîte de dialogue de téléchargement afficher un nom de fichier de téléchargement convivial.
2. Laissez les deux autres endroits du navigateur qui affichent GetPdf afficher également du contenu convivial.
Personnalisez l'ActionFilter et modifiez l'en-tête pour qu'il devienne en ligne. (Je ne sais pas s'il y aura des dangers cachés à le remplacer directement.)
public class MyPdfActionFilter : ActionFilterAttribute { public override void OnResultExecuted(ResultExecutedContext filterContext) { //Content-Disposition=attachment%3b+filename%3d%22The+Garbage+Collection+Handbook.pdf%22} var filerHeader = filterContext.HttpContext.Response.Headers.Get("Content-Disposition"); if (!string.IsNullOrEmpty(filerHeader) && filerHeader.Substring(0, "attachment".Length).ToLower().Equals("attachment")) { filterContext.HttpContext.Response.Headers["Content-Disposition"] = "inline" + filerHeader.Substring("attachment".Length, filerHeader.Length - "attachment".Length); } } }
Implémentation personnalisée d'ActionNameSelector Interception et jugement des noms d'action.
public class MyActionNameSelecter : ActionNameSelectorAttribute { public override bool IsValidName(ControllerContext controllerContext, string actionName, MethodInfo methodInfo) { return actionName.Contains("-PDF文件预览"); } }
Le code dans le contrôleur est modifié comme suit
[MyActionNameSelecter] [MyPdfActionFilter] public ActionResult GetPdf() { return new FilePathResult("~/content/The Garbage Collection Handbook.pdf", "application/pdf") //增加FileDownloadName设置,但是这会让内容以附件的形式响应到浏览器(具体参考文件响应模式:内联和附件)。 //文件变成被浏览器下载。 { FileDownloadName = "The Garbage Collection Handbook.pdf" }; }
Le contenu de la page est modifié comme suit
@{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport" content="width=device-width" /> <title>Index</title> </head> <body> <p> @* 第二个参数可能是一个动态生成的内容,需要ACTION中增加名称选择拦截,所以自定义了一个ActionNameSelectorAttribute类满足要求。 *@ @Html.ActionLink("预览PDF", "The Garbage Collection Handbook-PDF文件预览", null,new { target="_blank"}) </p> </body> </html>
Effet final
Pour plus d'articles liés à ASP.NET MVC aperçu direct des fichiers PDF, veuillez faire attention au site Web PHP chinois !