2010-09-02 85 views
94

如果我看Razor View Engine,那么我会看到一个非常简洁的语法,它并不特别与生成html相关联。所以我想知道,在asp.net的“普通”.net环境中使用引擎之外的引擎是多么容易,例如生成文本,代码......是否可以在asp.net外部使用Razor View Engine

任何指针,示例,注释或解释都是受欢迎的。

回答

70

这里有两个问题:

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

因此,举例来说,虽然这是(因为<div>标记的)有效剃刀代码:

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

下面的代码片断是无效的(因为你好仍然被视为代码!):

@if(printHello) { 
    Hello! 
} 

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

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

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

@if(printHello) { 
    @:Hello! 
} 
+2

嗯,我正在考虑用它来生成电子邮件或即时IronPython代码代。由于这些不使用标签,因此最好查看其他选择。感谢你的回答。 – Thomas 2010-09-03 07:23:47

+6

@Thomas Razor在这些场景中应该可以做得很好,你只需要不时添加这些魔术''标签或者使用'@:'''。一旦支持VS编辑器支持Razor语法,就可以很容易地判断转换发生的时间。 – marcind 2010-09-03 15:42:43

3

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

+0

这需要upvotes因为T4有与Razor相似,并且是一个实际的多用途代码生成器,作为Visual Studio中的一个功能提供 - 实质上它是一个通用的'Razor' – 2015-07-01 22:02:13

+0

我的理解是T4模板只能在编译时更改, .tt文件被转换并保存为.cs文件。在我的使用中,一个半技术用户想要更新模板而不必重新构建应用程序。有没有简单的方法可以使用T4模板来实现? – daveb 2017-03-22 16:06:41

+0

很可能,只要它生成的内容可以被解释,就像CSHTML可以在运行时由Razor引擎一样。你也可以通过编程触发它来生成代码,但编译代码必须由编译器解析才能使用.... – 2017-03-27 19:39:52

32

检查RazorEngine,它是建立在剃刀之上的微架构,可以让你做到这一点。

+0

在.net 4中定位应用程序时安装此项目时出现问题,需要更新。 – 2014-06-24 13:08:29

+0

不工作atm。我正在寻找另一种选择。 – 2017-08-18 14:51:38

18

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

编译和执行模板是两行代码那样简单:

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

您是否突出了RazorTemplates b/c的线程安全性?此问题的其他建议解决方案之一是不是?我特别感兴趣的是RazorEngine。 – 2012-11-29 19:43:33

+1

这个项目还没有更新很久。 – 2014-06-24 13:07:56

7

两个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); 
相关问题