【发布时间】:2012-07-11 14:50:00
【问题描述】:
我有我的视图设置来预编译,因此,如果我在运行时尝试读取视图文件(例如“~\Views\User\Report.cshtml”),我会得到以下虚拟 -文本,而不是我认为的内容:
这是预编译工具生成的标记文件,请勿删除!
问题是,我想重新使用 cshtml 视图,并在运行时以另一种方式重新渲染它,但由于上述限制,我不能。
场景:
管理员可以在 /User/Report 路由中查看用户列表。它输出一些 HTML,其中包含所有用户的列表,以及他们在 HTML 表中的信息。这些管理员经常想要下载这个 html 文件(样式和所有),以将其作为附件通过电子邮件发送给其他人。当然,他们可以在浏览器中转到“文件”->“保存”,但我想通过向“以 HTML 格式下载此报告”页面添加一个链接来简化该操作,该链接将简单地返回相同页面的内容,作为强制 -下载的 HTML 文件 (2012-07-11_UserReport.html)。
所以,我尝试做的是通过 ASP.NET 的 File() 方法运行 Report.cshtml 文件的内容来重新渲染视图,如下所示:
var html = System.IO.File.ReadAllText(Server.MapPath(@"~\Views\User\Report.cshtml"));
var bytes = System.Text.Encoding.UTF8.GetBytes(html);
return File(bytes,"text/html",string.Format("{0}_UserReport.html",DateTime.Now.ToString("yyyy-MM-dd")));
但是,就像我之前提到的,文件作为虚拟文本返回,而不是视图,因为我正在预编译视图。
我知道要绕过预编译,我可以简单地复制 Report.cshtml 文件,并将其重命名为 Report.uncompiled(当然是将其添加到 csproj 中)并阅读它的内容,这是一个不错的解决方案,但还不够好。
我真正想知道的是:有没有办法可以获取预编译的内容?我查看了大会的嵌入式资源,但它们不存在。有什么想法/建议吗?
已更新为当前解决方案
所以在搜索了更多之后,并尝试使用 WebClient/WebRequest 向路由的 URL 发出请求并将响应发送回用户下载,同时尝试传递用户的 .ASPXAUTH cookie (这使得 WebClient/WebRequest 因某种原因超时?我什至尝试创建一个新票,结果相同)我最终做了我不想做的事情:复制视图文件,然后重命名它,这样它就不会被预编译.
视图文件(Report.uncompiled)必须按原样修改一下,然后我通过RazorEngine's Razor.Parse 方法运行它并得到了我需要的东西,但它只是感觉很hackey。即使在编译之后,仍然想要一种访问视图文件 (Report.cshtml) 的方法。
var templateHtml = Razor.Parse(System.IO.File.ReadAllText(Server.MapPath(@"~\Views\User\Report.uncompiled")),model);
var bytes = System.Text.Encoding.UTF8.GetBytes(templateHtml);
return File(bytes, "text/html", string.Format("{0}_UserReport.html", DateTime.Now.ToString("yyyy-MM-dd")));
【问题讨论】:
标签: asp.net asp.net-mvc asp.net-mvc-3