是否可以在asp.net之外使用Razor View Engine


102

如果我看一下Razor View Engine,那么我会看到一种非常简洁的语法,它与生成html并没有特别的联系。因此,我想知道,在“正常” .net环境中使用asp.net外部的引擎有多容易,例如生成文本,代码,...

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

Answers:


80

这里有两个问题:

  1. 是的,您可以在ASP.NET应用程序域的上下文之外运行Razor View Engine,如Andrew的博客中所述:http : //vibrantcode.com/blog/2010/11/16/hosting-razor-outside-of -aspnet-revised-for-mvc3-rc.html
  2. 但是,从Razor解析器使用的存在<tags>来确定代码和标记之间的过渡的意义上讲,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!
}

2
好吧,我当时正在考虑使用它来生成诸如电子邮件或即时IronPython代码生成之类的东西。由于这些标签不使用标签,因此最好查看其他替代标签。感谢你的回答。
托马斯

6
@Thomas Razor在这些情况下应该可以正常工作,您只需要添加这些魔术<text>标记或不时使用即可@:。一旦VS编辑器对Razor语法提供了支持,将很容易分辨出何时发生过渡。
2010年


21

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

编译和呈现模板仅需两行代码:

var template = Template.Compile("Hello @Model.Name!");
Console.WriteLine(template.Render(new { Name = "World" }));

1
您是否正在突出显示RazorTemplates b / c的线程安全性,但该问题的其他建议解决方案之一不是?我对RazorEngine特别感兴趣。
史蒂夫·谢弗勒

9

无论RazorEngineRazorTemplates已经在这里提到的,但检查出RazorMachine。您可以简单地将非MVC应用程序指向(另一个)现有MVC应用程序的〜/ Views文件夹,通过发送适当的模型执行并在两行代码中获取渲染的输出:

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

3

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


这需要投票,因为T4与Razor有相似之处,并且是一个真正的通用代码生成器,作为Visual Studio的一项功能即装即用-本质上是一个通用的“ Razor”
Dan Ling,

据我了解,T4模板只能在编译时更改,.tt文件将转换为并保存为.cs文件。在我的用法中,半技术用户希望更新模板而不必重建应用程序。有没有简单的方法可以使用T4模板来实现?
daveb

只要它生成的内容都可以解释,就像CSHTML可以在运行时由Razor引擎解释一样。您也可以通过可编程方式触发它来生成代码,但是编译后的代码必须由编译器解析才能使用....
Brian Mains
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.