102

如果我查看 Razor 视图引擎,我会看到一个非常简洁的语法,它与生成 html 没有特别关联。所以我想知道,在“普通”.net 环境中使用 asp.net 之外的引擎有多容易,例如生成文本、代码、......

欢迎任何指针、示例、评论或解释。

4

5 回答 5

79

这里有两个问题:

  1. 是的,您可以在 ASP.NET 应用程序域的上下文之外运行 Razor 视图引擎,如 Andrew 的博客中所述:http: //vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of -aspnet-revised-for-mvc3-rc.html
  2. <tags>但是,从 Razor 解析器使用 的存在性来确定代码和标记之间的转换的意义上讲,Razor 仍然主要专注于生成类似 xml 的标记(例如 HTML) 。您可能可以使用它来生成任何文本,但是当您的输出与 Razor 关于您的意图的假设不匹配时,您可能会遇到问题。

因此,例如,虽然这是有效的 Razor 代码(因为<div>标签):

@if(printHello) {
   <div>Hello!</div>
}

以下代码段无效(因为 Hello! 仍被视为代码):

@if(printHello) {
   Hello!
}

但是有一个特殊的<text>标签可以用来强制多行块的转换(<text>标签不会被渲染):

@if(printHello) {
   <text>Hello!
   Another line</text>
}

还有一个更短的语法来强制单行转换使用@:

@if(printHello) {
   @:Hello!
}
于 2010-09-02T23:13:36.287 回答
33

检查RazorEngine,它是一个建立在 Razor 之上的小框架,允许您执行此操作。

于 2011-10-11T13:34:47.080 回答
21

看看RazorTemplates库。它比 RazorEngine 库更轻量级,它是线程安全的,并且具有非常好的最小接口。

编译和渲染模板就像两行代码一样简单:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));
于 2012-11-20T11:26:14.650 回答
9

RazorEngine和RazorTemplates都已在此处提及,但请查看RazorMachine。您可以简单地将非 MVC 应用程序指向(另一个)现有 MVC 应用程序的 ~/Views 文件夹,通过发送正确的模型执行并在 2 行代码上获得渲染输出:

var sb = new StringBuilder();

//RazorMachine magic:
//*tweets* is basically List<TwitterPost> - simple collection of custom POCO
//first param for rm.ExecuteUrl points to ~/Views folder, MVC style
var rm = new RazorMachine(htmlEncode: false);
ITemplate template = rm.ExecuteUrl("~/twitter/twitter", tweets);

//do whatever you want with result
sb.Append(template);
于 2012-11-28T16:07:54.793 回答
3

生成代码或文本:您的意思是像 T4 模板:http: //msdn.microsoft.com/en-us/library/bb126445.aspx或 codesmith 工具?

于 2010-09-02T16:19:50.937 回答