预编译视图:我还可以在运行时读取内容吗?

时间:2012-07-11 21:41:00

标签: asp.net asp.net-mvc asp.net-mvc-3

我将我的视图设置为预编译,因此,在运行时如果我尝试读取视图文件(例如“〜\ Views \ User \ Report.cshtml”),我会得到以下虚拟 - 文字,而不是我的观点内容:

  

这是预编译工具生成的标记文件,不应删除!

问题是,我想重新使用cshtml视图,并在运行时以另一种方式重新渲染它,但我不能因为上述限制。

情景:

管理员可以在/ User / Report路由中查看用户列表。它输出一些HTML,其中包含所有用户的列表,以及HTML表中的信息。这些管理员经常想要下载这个html文件(样式和所有)以通过电子邮件将其作为附件发送给其他人。当然,他们可以在他们的浏览器中转到File-> Save,但我想通过添加链接到页面“将此报告作为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")));

1 个答案:

答案 0 :(得分:0)

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");
}

只要您的用户点击一个按钮,就会有这个火,那么它会在哪里保存页面的当前内容?您可能还有一个目录选择器,并将它们选择的任何内容提供给第二个参数。

它基本上与浏览器保存相同,如果这是你想要的。