背景及需求
项目使用的是MVC4框架,其中有一个功能是根据设置生成便携文档格式文件,并在点击时直接预览。
实现过程
1、第一版实现代码:
超文本标记语言内容
@ { Layout=null}!DOCTYPE HTMl HTMl head meta name=' viewport ' content=' width=device-width '/TItle INDEX/TItle/head body div @ Html .ActionLink('预览PDF ',' GetPdf ',null,new { target=' _ blank ' })/div/body/html控制器代码
public action result GetPdF(){ 0返回新的文件路径结果(' ~/内容/The垃圾堆收集手册。Pdf ','应用程序/pdf ');}缺点:标题和文件下载时名称不是很友好。
1、第二版实现代码:
我们做了2件事情:
1、让下载弹出框能显示友好的下载文件名。
2、让浏览器中的其他两个显示GetPdf的地方也显示友好的内容。
自定义ActionFilter,对页眉进行修改,变为内联。(直接这么替换不知道会不会有隐患。)
公共类空的派系过滤器: ActionFilterAttribute { public override void OnResultExecuted(ResultExecutedContext filter context){//Content-Disposition=attachment;文件名="垃圾收集手册"。HttpContext。回应。标题。获取('内容-处置');if(!字符串IsNullOrEmpty(文件阅读器)文件阅读器。子字符串(0,"附件"。长度)。ToLower().等于('附件){ filterContext .http上下文。回应。标题['内容处理']='内嵌'文件阅读器.子字符串('附件。长度,文件阅读器。长度-"附件"。长度);} } }自定义操作名称选择器实现对行动名称的拦截和判断。
公共类my ActionNameSelecter : actionNameSelectorattribute {公共重写bool是有效名称(controller context controller context,字符串actionName,方法信息方法信息){返回操作名称.包含('-PDF文件预览');} }控制器内代码修改如下
[MyActionNameSelecter][MyPdpinyFilter]公共操作结果GetPdF(){ 0返回新文件路径结果(' ~/内容/The垃圾堆收集手册。Pdf ','应用程序/pdf') //增加文件下载名称设置,但是这会让内容以附件的形式响应到浏览器(具体参考文件响应模式:内联和附件)。//文件变成被浏览器下载{文件下载名称='垃圾收集手册。pdf ' };}页面内容修改如下
@ { Layout=null}!DOCTYPE htmlhtmlhead元名称=' viewport '内容=' width=device-width '/title index/title/head dy div @ *第二个参数可能是一个动态生成的内容,需要行为中增加名称选择拦截,所以自定义了一个ActionNameSelectorAttribute类满足要求*@ @Html .ActionLink('预览《垃圾收集手册》文件预览,null,new { target=' _ blank ' })/div/body/html最终效果
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持我们!