【问题标题】:Precompiled views: can I still read the contents at runtime?预编译视图:我仍然可以在运行时读取内容吗?
【发布时间】: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


    【解决方案1】:

    WebClient 类会起作用吗?

    using System.Net;
    
    using (WebClient client = new WebClient ()) 
    {
        client.DownloadFile("http://yourwebsite.com/test.html", @"C:\directory.html");
        // If you just want access to the html, see below
        string html = client.DownloadString("http://yourwebsite.com/test.html");
    }
    

    只要您的用户单击一个按钮,就会触发此事件,然后它将页面的当前内容保存在哪里?您可能还可以有一个目录选择器,并将他们选择的任何内容输入第二个参数。

    它本质上与浏览器保存的功能相同,如果你想要的话。

    【讨论】:

    • 是的,这是我试图避免的另一个选项,因为我认为在预编译视图时会有一种更内置的方式直接访问视图数据。
    • 此外,资源位于经过身份验证的区域后面,因此进行 WebClient 调用需要我将身份验证传递给该 url。
    猜你喜欢
    • 2014-01-29
    • 2011-06-06
    • 2015-04-20
    • 1970-01-01
    • 1970-01-01
    • 2011-07-26
    • 2012-09-10
    • 2017-12-01
    • 2013-03-19
    相关资源
    最近更新 更多