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

时间:2010-09-02 15:58:40

标签: asp.net asp.net-mvc code-generation templating razor

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

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

5 个答案:

答案 0 :(得分:78)

这里有两个问题:

  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仍主要专注于生成类似xml的标记(例如HTML),因为Razor解析器使用<tags>的存在来确定代码和标记之间的转换。您可以使用它来生成任何文本,但是当您的输出与Razor关于您的意图的假设不匹配时,您可能会遇到问题。
  3. 例如,虽然这是有效的Razor代码(因为<div>标记):

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

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

    @if(printHello) {
       Hello!
    }
    

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

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

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

    @if(printHello) {
       @:Hello!
    }
    

答案 1 :(得分:33)

检查RazorEngine,这是一个基于Razor构建的小框架,允许您这样做。

答案 2 :(得分:21)

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

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

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

答案 3 :(得分:8)

此处已提及 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);

答案 4 :(得分:3)

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