好的,所以我可以将问题归结为以下几点:
您有一个类似自托管 WebAPI/控制台应用程序的东西,并且想要使用 Razor 来
创建 HTML 页面。这些 Razor 模板使用 Sytem.Web.WebPages 中的一些类
或 System.Web.Mvc 等,它们捆绑在自己的程序集中。
但是这些类被使用only意见中。当以调试模式启动时,您将看到
运行时确实not加载这些程序集,无论它们是否添加到项目中
参考与否。编译razor文件时出现,编译器只看到命名空间
来自加载的程序集,因此您会得到那些 X-not-found 异常。您必须加载所需的
手动程序集(并确保找到兼容版本)。
一个简短的例子:
我们有一个layout.cshtml和一个index.cshtml。我们使用一些 HTML 帮助函数来创建表单。
布局.cshtml:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
</head>
<body>
<div class="main-content">
@RenderBody()
</div>
</body>
</html>
索引.cshtml:
@using System.Web.Mvc;
@{
Layout = "layout";
}
<div class="box-body">
<h1>Hello!</h1>
<p>
Got Html? @MvcHtmlString.Create("<b>FooBarBaz</b>")
</p>
</div>
解析 razor 文件并处理 HTML 输出的源代码。为了简单起见
假设所有文件都位于可执行文件附近;您可能需要适应您的存储结构:
//load required assembly. By using the short name here the runtime uses
//the the first one that matches. See MSDN for further information
System.Reflection.Assembly.Load("System.Web.Mvc");
//cache the template before the actual page to avoid a null reference exception
RazorEngine.Razor.GetTemplate(File.ReadAllText("layout.cshtml"), "layout");
var result = RazorEngine.Razor.Parse(File.ReadAllText("index.cshtml"));
Console.Write(result);
然后,您需要将程序集添加到项目中(在此示例中可以通过 nuget、Microsoft.AspNet.Mvc),并且可能手动添加引用(如果未自动添加)。这样,您就可以获得(希望)正确的版本以及可执行文件。
最后一点:
ASP.Net MVC 视图中几乎所有可用的东西(例如 @Html)都是由
ASP.NET 管道,因此直接使用 Razor 时不可用。 (我不知道是否或如何
除了模型之外,还可以将对象传递给 Razor)所以大多数类和函数
来自 System.Web.Mvc 或 System.Web.WebPages 命名空间可能无法访问
(无需重建 ASP.NET 的部分内容)。
使用的 @Layout 和 @RenderBody() 通常也是其中的一些 ASP.NET 帮助器。但由于它们非常常见,因此作者似乎在 RazorEngine 解析器中手动重新创建了它们的函数。