【发布时间】:2011-04-07 10:22:52
【问题描述】:
如果我查看 Razor 视图引擎,我会看到一个非常简洁的语法,它与生成 html 没有特别的关联。所以我想知道,在“普通”.net 环境中使用 asp.net 之外的引擎有多容易,例如生成文本、代码……
欢迎任何指针、示例、评论或解释。
【问题讨论】:
标签: asp.net asp.net-mvc code-generation templating razor
如果我查看 Razor 视图引擎,我会看到一个非常简洁的语法,它与生成 html 没有特别的关联。所以我想知道,在“普通”.net 环境中使用 asp.net 之外的引擎有多容易,例如生成文本、代码……
欢迎任何指针、示例、评论或解释。
【问题讨论】:
标签: asp.net asp.net-mvc code-generation templating razor
这里有两个问题:
<tags> 的存在来确定代码和标记之间的转换。您可能可以使用它来生成任何文本,但是当您的输出与 Razor 关于您的意图的假设不匹配时,您可能会遇到问题。例如,虽然这是有效的 Razor 代码(因为 <div> 标记):
@if(printHello) {
<div>Hello!</div>
}
以下 sn-p 无效(因为 Hello! 仍被视为代码):
@if(printHello) {
Hello!
}
但是有一个特殊的<text> 标记可用于强制多行块的过渡(<text> 标记不会被渲染):
@if(printHello) {
<text>Hello!
Another line</text>
}
还有一个更短的语法可以使用 @: 强制转换单行:
@if(printHello) {
@:Hello!
}
【讨论】:
<text> 标签或不时使用@:。一旦 VS 编辑器支持 Razor 语法,就很容易判断何时发生转换。
检查RazorEngine,这是一个建立在 Razor 之上的小框架,可让您执行此操作。
【讨论】:
看看RazorTemplates 库。它比 RazorEngine 库更轻量级,它是线程安全的,并且具有非常好的最小接口。
编译和渲染模板就像两行代码一样简单:
var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));
【讨论】:
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);
【讨论】:
生成代码或文本:您的意思是像 T4 模板:http://msdn.microsoft.com/en-us/library/bb126445.aspx 或 codesmith 工具?
【讨论】: